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
:
Если я 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.
Посмотреть здесь:
Используя 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 сняла блокировку ядра, другие команды смогут работать.
Попробуйте изменить учетную запись пользователя, под которым вы запускаете команды git, и посмотрите, решит ли это проблему - это помогло нам.
Хотя ответ Грега решает непосредственную проблему скорости, я чувствовал, что это только маскировка проблемы, а не ее решение.
Я начал медленно выполнять git bash и, следуя инструкциям Грега, определил __git_ps1
как виновник.
Вместо того, чтобы изменять информацию командной строки (я считаю полезным иметь отображаемую информацию), я нашел решение, которое сработало для меня, описанное в сообщении в блоге:
Решение для замедления Git bash при входе в систему как пользователь домена
Немного покопавшись в интернете, я обнаружил, что в моей учетной записи git используется учетная запись сети по умолчанию. Это означает, что git будет искать в этом каталоге все время, вызывая задержку.
Чтобы это исправить, я создал локальную переменную среды пользователя, переопределив переменную по умолчанию и установив для нее значение%USERPROFILE%, которое указывает на c:\users[username].
Такое же решение было также размещено на SO, отвечая на аналогичный вопрос.
Добавление переменной среды вернуло git на полную скорость, и я все еще получаю информацию о командной строке.
Если sh вешает перечисление серверов входа в NetServerEnum, попробуйте установить переменную среды LOGONSERVER на фактический сервер входа.
У меня были проблемы с медленным процессом разветвления на компьютере с Windows XP. Иногда процесс обработки может занять несколько минут.
Решением для меня было очистить папку TEMP на компьютере. Компьютер был общим ресурсом, и в течение нескольких лет в нем накапливались файлы.