Полуночный командир иногда очень медленный

Я использую Midnight Commander с Cygwin 64 бит на Windows 10 64 бит.

После перехода на новую машину и чистой переустановки Windows и Cygwin мой полуночный командир время от времени начинал очень тормозить. Перезапуск помогает, но это случается слишком часто, чтобы это было жизнеспособным решением. (перезапуск не помогает).

Я понятия не имею, что может быть причиной этих икоты. MC нормально работает: нажатия клавиш работают хорошо, просмотр и редактирование выполняются мгновенно, но одна вещь занимает до 10 секунд - смена каталогов. Поиск в файлах имеет похожую задержку, но только один раз (т.е. не в каждом chdir это могло бы быть сделано). В не-mc Cygwin эта проблема не возникает.

Диспетчер задач не показывает ненормально высокую загрузку ЦП или памяти ни в одном процессе. я имею cygserver работает, используя bash как моя оболочка PS1 настройки, мои $CYGWIN только winsymlinks:native,

Вот strace войти, может у кого-то есть идея, что пошло не так? http://pastebin.pl/view/9b839815
(записано с LOCALE=C strace -q -o /tmp/mc-log mc /tmp)

В записанном сеансе у меня есть:

  • начал MC в /tmp каталог
  • поступил /tmp/NVIDIA Corporation каталог
  • пошел обратно (..)
  • поступил /tmp/mc-chanibal каталог
  • пошел обратно (..)
  • выход с F10

Дополнительная информация о времени:

Найти все каталоги в моем $HOME занимает 4,6 секунды:

$ time find ~ -type d | wc -l
(snipped two directories without permissions)
19919

real    0m4.626s
user    0m0.796s
sys     0m3.765s

ls -al на все эти каталоги ушло много времени, но в среднем было довольно мало:

time (find ~ -type d | while read f; do { time ls -al $f; } \
   |& awk '$1 == "real" { printf $2 }'                      \
   | awk -Fm '{printf( "%2.4f", $1 * 60 + $2 )}';           \
   echo -e "\t$f"; done                                     \
) >/tmp/ls-time-log ;
(snipped two dirs without permissions)

real    12m21.870s
user    7m4.576s
sys     16m34.446s

Среднее время, чтобы сделать ls -al 0,020 с, мин 0,017, макс 0,154:

$ awk 'BEGIN { sum=0; min=9999; max=0;  minf=""; maxf=""; }     \
      $1 { sum += $1;                                           \
           if(min > $1) { min = $1; minf = $2; };               \
           if(max < $1) { max = $1; maxf = $2; } }              \
      END { print "avg: " sum/NR; print "min: " min " "         \
          minf; print "max: " max " " maxf }' </tmp/ls-time-log
avg: 0.0204292
min: 0.0170 /cygdrive/c/Users/chanibal/AppData/Roaming/OculusClient/Local
max: 0.1540 /cygdrive/c/Users/chanibal/AppData/Local/Android/sdk/platforms/android-23/data/res/drawable-hdpi

С учетом накладных расходов на измерение времени оно составляет в среднем 16 м34 с /19919 = 0,499 с за вызов ls -al, два awkс итерации find, Не очень хорошо, но не четыре секунды.


Нормализация с cygpath не займет много времени:

$ time strace cygpath -aw /tmp/NVIDIA\ Corporation/ | grep normalize_posix_path
  116   11175 [main] cygpath 3524 normalize_posix_path: src /tmp/NVIDIA Corporation/
   20   11195 [main] cygpath 3524 normalize_posix_path: /tmp/NVIDIA Corporation/ = normalize_posix_path (/tmp/NVIDIA Corporation/)

real    0m0.034s
user    0m0.015s
sys     0m0.000s

РЕДАКТИРОВАТЬ: добавлен этот вопрос в трассировку MC

1 ответ

Решение

Я нашел проблему и решил, что это Windows 10 или неисправная аппаратная ошибка, а не MC. Midnight Commander действительно вызывает эту проблему, но делает это, используя ОС ожидаемым образом, так что это не его вина.

Точнее говоря, проблема в том, что перечисление устройств занимает время (ровно 4 или 5 секунд в Windows PowerShell или 4 секунды в Cygwin). Исправление в моем случае состояло в том, чтобы отключить привод DVD, который занимал время. Подробности в ветке списка рассылки Cygwin.

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