Shtsh (oni_ddr) wrote,
Shtsh
oni_ddr

Categories:

Решение проблемы с медленной записью на USB-flash

Были два компа, на которых установлены debian sid (ядра 30 и 32), одно время стоял на одном из них арч с 30м ядром, на которых возникала проблема.
Проблема в том, что когда шла запись на флешку, скорость была очень низкая (сначала, когда пишет в кэш, всё хорошо, но потом она падала до ~500-700 кбайт/с и система начинла довольно сильно тормозить. Причем тормоза настолько сильные, что иногда иксы виснут намертво на несколько минут.
Что забавно, проверял на серваке с 26м ядром, там всё нормально (тоже debian).
А проблема была очень распространённая, но внятного ответа в интернетах не нашлось :( Поэтому при помощи замечательного сайта Welinux.ru и хорошо разбриающихся в системе людей, было найдено разрешение проблемы


сначала узнали, какие прывания отвечают за usb
cat /proc/interrupts | grep usb
21: 45801 9374917 IO-APIC-fasteoi ehci_hcd:usb2, HDA Intel
22: 1 28 IO-APIC-fasteoi ohci_hcd:usb4
23: 1827 188061 IO-APIC-fasteoi ehci_hcd:usb1, ohci_hcd:usb3

они отвечают за USB, когда копируешь, прерывания балансируются между процессорами, скорее всего блок памяти при передачи прерывания один и процессоры поочередности к нему обращаются, тем самым вызывая глобальную блокировку
После этого нужно зафиксировать их, чтобы процессоры не переключались
в данном случае так
echo 1 > /proc/irq/21/smp_affinity
echo 1 > /proc/irq/22/smp_affinity
echo 1 > /proc/irq/23/smp_affinity
На других машинах нужно посмотреть какие прерывания обслуживают USB и зафиксировать их, а не 21,22,23

Для простоты наваял скрипт, который детектит прерывания, на которых висят usb и указывает, какой процессор выполняет работу с ними, скопировал его в /usr/local/bin и засунул его в загрузку системы (прописал /usr/local/bin/setusbwrite в /etc/init.d/rc.local)

#!/bin/sh

for interruption in `cat /proc/interrupts | grep usb | awk '{print $1}'| sed -e 's/\://g'` ; do
echo "Setting 1 in /proc/irq/${interruption}/smp_affinity";
echo 1 > /proc/irq/${interruption}/smp_affinity;
done

Примечание. Работа скрипта проверялась на двухпроцессорных (точнее, двухъядерных) машинах. Насчет работы с большим числом процессоров проверки не было.

И теперь у меня нормальная скорость и никаких тормозов.
Tags: debian, howto, linux, usb
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments