Назад | Перейти на главную страницу

cygwin grep работает в 680 раз быстрее через ssh, чем через удаленный рабочий стол

Запуск grep, открыв терминал Cygwin через Microsoft Remote Desktop на Windows Server 1012 R2 (как изначально?):

Administrator@MYSERV /cygdrive/d/bin/beta
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme

real    1m40.568s
user    1m40.405s
sys     0m0.140s

Точно такая же команда для тех же файлов, выполняемая при подключении через Cygwin SSH:

Administrator@MYSERV /cygdrive/d/bin/beta
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delmessh

real    0m0.148s
user    0m0.140s
sys     0m0.000s

Исполняемый файл grep.exe такой же, выходной файл такой же, но время выполнения составляет доли секунды против почти 2 минут.

Учитывая, что cygwin SSH работает под специальной настройкой пользователя, я попытался ssh localhost на удаленном рабочем столе; время выполнения: 1 минута 40 секунд.

Есть ли этому какое-то логическое или нелогичное объяснение? Какие настройки, которые я могу проверить в Windows Server 2012, искусственно подавляют процессы удаленного рабочего стола?

Обновить: запуск C: \ cygwin \ bin \ grep.exe из командной строки Windows cmd также мгновенно. Итак, есть проблема с терминалом Cygwin.

Обновление 2: Я googledd, что наличие мертвых файловых ресурсов в PATH может замедлить работу терминала Bash. Вопреки моей первоначальной надежде, стирание переменной $ PATH ничего не дало. У меня также нет мертвых ссылок в PATH.

Решение, слава @Paul Haldane: Grep похоже скинул $LANG значение en_US.UTF-8, который используется по умолчанию в Cygwin. Это особенно сильно сказывается на производительности регулярных выражений. Бег grep -F также был медленнее, но всего в 4 раза.

Вот проверка на отдельном сервере:

$ echo $LANG
en_US.UTF-8

$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme

real    1m56.425s
user    1m56.218s
sys     0m0.171s

$ LANG=''

$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme2

real    0m0.286s
user    0m0.265s
sys     0m0.015s

$ diff delme delme2
** no difference **

Решение, слава @Paul Haldane:

Был ошибка в grep, которая приводила к медленному поиску, когда LANG был установлен не на C - Пол Холдейн 22 часа назад

Grep, похоже, сбрасывается значением $ LANG для en_US.UTF-8, которое в Cygwin используется по умолчанию. Это особенно сильно сказывается на производительности регулярных выражений. Команда grep -F также была медленнее, но только в 4 раза.

Вот проверка на отдельном сервере:

$ echo $LANG
en_US.UTF-8

$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme

real    1m56.425s
user    1m56.218s
sys     0m0.171s

$ LANG=''

$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme2

real    0m0.286s
user    0m0.265s
sys     0m0.015s

$ diff delme delme2
** no difference **

Например, ssh добавляет накладные расходы из-за шифрования, но это не объясняет переход от секунд к минутам, а объясняет тот факт, что Cygwin эмулирует терминал Unix, а эмуляция выполняется медленно. Вы можете найти более подробную информацию об этом в Википедии. https://en.wikipedia.org/wiki/Cygwin

Эта часть объясняет это довольно хорошо

Системный вызов fork для дублирования процесса полностью реализован, но не соответствует Windows API. Например, нельзя было использовать стратегию оптимизации копирования при записи. [5] [6] [7] В результате вилка Cygwin довольно медленная по сравнению с Linux и другими. (Эти накладные расходы часто можно избежать, заменив использование техники fork / exec вызовами функций порождения, объявленных в специфичном для Windows заголовке process.h).