Git sh.exe процесс разветвления проблема на Windows XP, медленно?

Git необходим для моего рабочего процесса. Я запускаю MSYS Git на Windows XP на своем четырехъядерном компьютере с 3 ГБ ОЗУ, и обычно он работает быстро и быстро.

Внезапно возникла проблема, в результате которой для запуска любой команды из командной строки Git Bash требуется>30 секунд, включая ls или же cd, Интересно, что из командной строки bash это выглядит как ls работает довольно быстро, я могу увидеть вывод ls, но для возврата приглашения потребуется ~30 секунд. Если я переключаюсь на командную строку Windows (запустив cmd из меню "Пуск") Команды, относящиеся к git, также выполняются вечно, даже просто для запуска. Например git status может занять около минуты, прежде чем что-нибудь случится. Иногда процессы просто не заканчиваются.

Обратите внимание, что у меня установлен MSYS Git, а также обычный MSYS для таких вещей, как MinGW а также make,

Я считаю, что проблема связана с sh.exe находится в C:\Program Files\Git\bin, Когда я бегу ls из приглашения bash, или когда я вызываю git из командной строки Windows диспетчер задач показывает до четырех экземпляров sh.exe процессы, которые приходят и уходят.

Вот жду ls вернуться, и вы можете увидеть, что диспетчер задач git.exe работает и четыре экземпляра sh.exe:Здесь я жду, когда ls вернется, и вы увидите, что в диспетчере задач запущен git.exe и четыре экземпляра sh.exe

Если я ctrl-c в середине ls Иногда я получаю ошибки, которые включают в себя:

sh.exe": fork: Resource temporarily unavailable
      0 [main] sh.exe" 1624 proc_subproc: Couldn't duplicate my handle<0x6FC> fo
r pid 6052, Win32 error 5
sh.exe": fork: Resource temporarily unavailable

Или для git status: $ git status

sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable

Можно ли это исправить, чтобы git снова работал быстро, и если да, то как?

Вещи, которые я пробовал:

  • перезагружать
  • Обновите MSYS Git до последней версии и перезагрузите
  • Обновите MSYS до последней версии и перезагрузите
  • Удалите MSYS, удалите и переустановите MSYS Git самостоятельно и перезагрузите компьютер.

Я бы очень хотел не стереть мой ящик и не переустановить Windows, но я сделаю это, если не смогу это исправить. Я больше не могу кодировать, если мне понадобится>30 с для запуска git status или же cd.

6 ответов

Решение

Обычно, когда программе требуется 30 секунд, чтобы сделать что-то, что должно быть мгновенным, скорее всего, это проблема тайм-аута ввода-вывода, обычно по сети, а не из-за скорости вашего ЦП или количества ОЗУ, которое у вас есть. Вы можете задаться вопросом, как работает сеть, но это законный вопрос (я бы тоже не знал о вашей системе).

Msysgit устанавливает специальную подсказку, которая запускает специальную функцию __git_ps1 это показывает некоторую полезную информацию в приглашении. Вы можете увидеть это используя echo $PS1для моей системы это показывает:

$ echo $PS1
\[\033]0;$MSYSTEM:\w\007 \033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\] $

Эта дополнительная информация не является обязательной, и вы можете отключить ее. Поэтому попробуйте следующее в окне Msysgit:

$ PS1='$ '
$

Это сбросит подсказку к значению по умолчанию $ и не пытайтесь запустить и команды внутри командной строки. Если это решит проблему с задержкой, вероятно, __git_ps1 функция. Попробуйте запустить его вручную:

$ __git_ps1
 (master)

и посмотрим, сколько времени понадобится, чтобы вернуться.

Вы можете исправить это, удалив строку, которая вызывает __git_ps1 от C:\Program Files\Git\etc\profile:

#Comment the lines below
#PS1='\[\033]0;$MSYSTEM:\w\007
#\033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\]
#$ '

Таким образом, мы столкнулись и с этой проблемой, и я думаю, что мы, наконец, проследили ее до реализации компанией MSYS модели безопасности Windows. Я постараюсь опубликовать краткое изложение проблемы:

Скриншот: Стек трассировки застрял sh.exe. Обратите внимание, когда msys-1.0.dll вызывает NetServerEnum()

Вот что происходит, когда sh.exe блокируется на 30 секунд. Так NetServerEnum() вызывается только в msys в одном месте, security.cc:228 в get_lsa_srv_inf()который называется get_logon_server() а также get_logon_server_and_user_domain(), который называется в create_token()который называется seteuid() в syscalls.cc, который вызывается setuid(),

По сути, происходит то, что когда инициализируется DLL-библиотека msys и sh.exe пытается вызвать setuid()msys пытается добросовестно соблюдать модель безопасности Windows и пытается найти список серверов домена из вашего домена / рабочей группы. К сожалению, в отличие от Linux, для Windows это блокирующий вызов, который занимает 5-30 секунд для завершения / тайм-аута, и, на самом деле, довольно ненужен для git.

Наше решение - создать новый msys.dll с отключенной "функцией" безопасности, установив для has_security значение false в winsup.cc. Bash/sh.exe, поставляемый с msysgit, был несовместим с нашей новой версией msys.dll, поэтому нам пришлось скомпилировать новый bash.exe тоже с нуля, понятия не имею почему. Конечным результатом было то, что sh.exe больше не пытается выполнить эти вызовы NetServerEnum и выполняет разделение lickity.

Если при выполнении нескольких одновременных команд Git наблюдается замедление, это может быть связано с проблемой блокировки ядра в msysgit

Мы видели, что при некоторых условиях несколько экземпляров git.exe будут ожидать одного и того же объекта ядра (внутри WaitForSingleObject()), что фактически означает, что в системе одновременно может быть запущена только одна команда git.

Посмотреть здесь:10 git.exe обрабатывает все ожидания на одном объекте ядра

Используя ProcessExplorer, мы могли видеть, что все процессы git.exe застряли здесь:

ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
ntoskrnl.exe!KeWaitForMutexObject+0x19f
ntoskrnl.exe!FsRtlCancellableWaitForMultipleObjects+0x5e
ntoskrnl.exe!FsRtlCancellableWaitForSingleObject+0x27 

Похоже, это связано с этой проблемой: http://code.google.com/p/msysgit/issues/detail?id=320 в том смысле, что это не Git, а среда выполнения псевдо-Linux (mingw), в которой, как представляется, содержится проблема.,

Мы изменили учетную запись пользователя, которая использовалась для запуска приложений из SYSTEM, на интерактивную учетную запись пользователя, и ожидания объекта ядра исчезли:

Здоровые процессы git.exe git.exe процессы нереста счастливо

Следовательно, замедление, которое вы видите, МОЖЕТ быть связано с каким-то конфликтом объектов ядра - только когда предыдущая команда git сняла блокировку ядра, другие команды смогут работать.

Попробуйте изменить учетную запись пользователя, под которым вы запускаете команды git, и посмотрите, решит ли это проблему - это помогло нам.

Хотя ответ Грега решает непосредственную проблему скорости, я чувствовал, что это только маскировка проблемы, а не ее решение.

Я начал медленно выполнять git bash и, следуя инструкциям Грега, определил __git_ps1 как виновник.

Вместо того, чтобы изменять информацию командной строки (я считаю полезным иметь отображаемую информацию), я нашел решение, которое сработало для меня, описанное в сообщении в блоге:

Решение для замедления Git bash при входе в систему как пользователь домена

Немного покопавшись в интернете, я обнаружил, что в моей учетной записи git используется учетная запись сети по умолчанию. Это означает, что git будет искать в этом каталоге все время, вызывая задержку.

Чтобы это исправить, я создал локальную переменную среды пользователя, переопределив переменную по умолчанию и установив для нее значение%USERPROFILE%, которое указывает на c:\users[username].

Такое же решение было также размещено на SO, отвечая на аналогичный вопрос.

Добавление переменной среды вернуло git на полную скорость, и я все еще получаю информацию о командной строке.

Если sh вешает перечисление серверов входа в NetServerEnum, попробуйте установить переменную среды LOGONSERVER на фактический сервер входа.

У меня были проблемы с медленным процессом разветвления на компьютере с Windows XP. Иногда процесс обработки может занять несколько минут.

Решением для меня было очистить папку TEMP на компьютере. Компьютер был общим ресурсом, и в течение нескольких лет в нем накапливались файлы.

Другие вопросы по тегам