Мой рабочий стол обычно очень отзывчив, даже при большой нагрузке. Но когда я копирую файлы на USB-накопитель, он всегда через некоторое время зависает. Под "зависанием" я подразумеваю:
- Перемещение фокуса с одного окна на другое может занять 10–20 секунд.
- Переключение рабочих столов может занять 10–20 секунд.
- Видео больше не обновляются (на YouTube звук продолжает воспроизводиться, только видео зависает)
Нагрузка на систему не является исключительно высокой, когда это происходит. Иногда я вижу много белого на xosview, что указывает на то, что ядро где-то занято.
На первый взгляд может показаться, что копирование файлов на USB-накопитель каким-то образом помешает работе Compiz, но я не могу себе представить, в чем может быть связь.
Вот вывод 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. Я знаю нескольких людей с этой проблемой. Вы можете найти несколько документов об этом в Интернете, например
- https://bbs.archlinux.org/viewtopic.php?id=112846&p=1
- http://lwn.net/Articles/467328/
- http://forum.manjaro.org/index.php?topic=2062.0
- Низкая производительность при копировании файлов на USB-устройства и с них
Я полностью исправил проблему на моей установке, выполнив следующее. Обратите внимание YMMV, не все исправления ниже могут быть необходимы, и, возможно, их будет недостаточно. Я мог что-то забыть, если честно. В любом случае, это моя установка, и она работает.
- Использовать ядро linux-ck
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
решение4
Замените кабель. Удалите окислы с usb-порта/кабелей.