Почему мой рабочий стол зависает, когда я копирую много файлов на USB-накопитель?

Почему мой рабочий стол зависает, когда я копирую много файлов на USB-накопитель?

Мой рабочий стол обычно очень отзывчив, даже при большой нагрузке. Но когда я копирую файлы на USB-накопитель, он всегда через некоторое время зависает. Под "зависанием" я подразумеваю:

  • Перемещение фокуса с одного окна на другое может занять 10–20 секунд.
  • Переключение рабочих столов может занять 10–20 секунд.
  • Видео больше не обновляются (на YouTube звук продолжает воспроизводиться, только видео зависает)

Нагрузка на систему не является исключительно высокой, когда это происходит. Иногда я вижу много белого на xosview, что указывает на то, что ядро ​​где-то занято.

На первый взгляд может показаться, что копирование файлов на USB-накопитель каким-то образом помешает работе Compiz, но я не могу себе представить, в чем может быть связь.

Вот вывод htop:

Вывод htop вскоре после зависания

Вот вывод iostat -c -z -t -x -d 1во время 2-минутного зависания:

19.07.2012 20:38:22
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1,27    0,00    0,38   37,52    0,00   60,84

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdg               0,00     2,00    0,00  216,00     0,00 109248,00  1011,56   247,75  677,69    0,00  677,69   4,63 100,00

Как видите, активен только внешний жесткий диск. Вот полный лог:http://pastebin.com/YNWTAkh4

Зависание началось в 20:38:01 и закончилось в 20:40:19.

Информация о программном обеспечении:

  • openSUSE 12.1
  • КДЕ 4.7.x
  • Файловые системы: reiserfs и btrfs на моем внутреннем жестком диске, btrfs на USB-накопителе

решение1

Моя первая догадка была btrfsв том, что процессы ввода-вывода этой файловой системы иногда берут верх. Но это не объясняет, почему X зависает.

Глядя на прерывания, я вижу следующее:

# cat /proc/interrupts 
           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       
  0:        179          0          0          0          0          0          0          0  IR-IO-APIC-edge      timer
  1:          6          0          0          0          0          0          0          0  IR-IO-APIC-edge      i8042
  8:          1          0          0          0          0          0          0          0  IR-IO-APIC-edge      rtc0
  9:          0          0          0          0          0          0          0          0  IR-IO-APIC-fasteoi   acpi
 12:         10          0          0          0          0          0          0          0  IR-IO-APIC-edge      i8042
 16:    3306384          0          0          0          0          0          0          0  IR-IO-APIC-fasteoi   ehci_hcd:usb1, nvidia, mei, eth1

Ну, хм. Драйвер USB использует тот же IRQ, что и видеокарта, и он первый в цепочке. Если он зависает (потому что файловая система делает что-то затратное), видеокарта голодает (и сеть тоже).

решение2

Я видел похожие проблемы сopenSUSEЯдро Linux-3.1 версии 12.1 и обнаружил, что отключение прозрачных огромных страниц помогло:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

Основная проблема заключается в том, что если приложение выделяет 4 МБ или больше, ядро ​​попытается выделить ему огромную страницу, для которой ему потребуется целая непрерывная оперативная память объемом 4 МБ. Теперь, если вокруг много грязных страниц, которые все еще нужно записать на медленное USB-устройство, оно ждет завершения этого ввода-вывода, прежде чем продолжить выделение памяти.

решение3

Как уже упоминалось, это, вероятно, связано с настройкой ядра hugepages. Я знаю нескольких людей с этой проблемой. Вы можете найти несколько документов об этом в Интернете, например

Я полностью исправил проблему на моей установке, выполнив следующее. Обратите внимание YMMV, не все исправления ниже могут быть необходимы, и, возможно, их будет недостаточно. Я мог что-то забыть, если честно. В любом случае, это моя установка, и она работает.

  • Использовать ядро ​​linux-ck
  • echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
  • echo never > /sys/kernel/mm/transparent_hugepage/defrag

решение4

Замените кабель. Удалите окислы с usb-порта/кабелей.

Связанный контент