Перейти к содержанию

Ацкие тормоза USB


Рекомендуемые сообщения

При копировании с/на USB девайсы начинались ужасающие тормоза системы вплоть до невозможности разблокировать сессию. Все работало медленно (очень и печально) во время копирования. 

Гугление показало вот что: (далее цитирую)

 

Проблема заключается в том, что когда идёт запись на флешку, скорость очень низкая (сначала, когда пишет в кэш, всё хорошо, но потом она падает до ~500-700 кбайт/с и система начинает довольно сильно тормозить. Причем тормоза настолько сильные, что иногда иксы виснут намертво на несколько минут.

Как выяснилось эмпирически, это случается из-за переключения процессоров и блокировок при использовании общего блока памяти. Логично решение указать, чтобы процессоры не переключались при обработки прерываний, на которых находятся usb.

Сначала в биосе отключаем опцию usb legacy support, заходим в систему и смотрим какие прерывания используются usb, для этого делаем:

 

grep usb /proc/interrupts
 16:         27          0   IO-APIC  16-fasteoi   ehci_hcd:usb1
 23:          0         29   IO-APIC  23-fasteoi   ehci_hcd:usb2
 

где 16 и 23 это прерывания на которых сидит USB

Далее можно узнать на каком процессоре сейчас все прерывания usb

 

root@lnv:/home/paul# cat /proc/irq/16/smp_affinity
1
root@lnv:/home/paul# cat /proc/irq/23/smp_affinity
1
 

на 1 потому что я уже все их сделал на 1, до этого было на 3

Теперь, что это значит
3 в шестнадцатеричной системе = 00000000.00000011 в двоичной (так как ядро скомпилировано с поддержкой 16 процессоров)
то есть обрабатыватся на CPU0, CPU1
Если нам нужно указать, чтобы обработка шла только на CPU0, то нужно задать 00000000.00000001, то есть 1
Если же нужно указать, чтобы обработка шла только на CPU1, то нужно задать 00000000.00000010, то есть 2

Теперь укажем, что будем обрабатывать на CPU0 все прерывания с висящими на них usb, естественно, всё делать нужно под рутом.

При загрузке 

Вот такой скриптец 

#!/bin/sh
for interruption in `grep usb /proc/interrupts| 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

 

положить например в /usr/bin

И прописать его в rc.local если есть или в /etc/init.d 

!

И реально - сейчас копирует файл 50гиг на MicroSD убогую в ридере, я при этом пишу нормально и вкладки в опере переключаются и ваще почти без тормозов.

 

Источник

 

 

 

 

Изменено пользователем Skaaraje
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...