Shtsh 18.01.2010 10:51

Есть вопрос!Медленная запись на USB-flash [решено]

Собственно, сабж. Есть два компа, на которых установлены debian sid (ядра 30 и 32), одно время стоял на одном из них арч с 30м ядром, поэтому не думаю, что в этом дело.

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

Что забавно, проверял на серваке с 26м ядром, там всё нормально (тоже debian).

Кстати, внятного ответа в интернетах не нашлось :( Вроде компьютеры не особо древние (оба Athlon 64 X2 с сата-винтами)

Это /var/log/dmesg

Наболело :( Хотел запостить в пятиминутке ненависти. Но, может, это просто у меня руки кривые.


Решено by evgenyl

Ты поставл маски на обработку прерываний 21,22,23 чтобы они обрабатывались только на 0ом процессоре
выше ты мне присылал
1
2
3
4
5
cat /proc/interrupts

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, когда копируешь, прерывания балансируются между процессорами, скорее всего блок памяти при передачи прерывания один и процессоры поочередности к нему обращаются, тем самым вызывая глобальную блокировку

На других машинах нужно посмотреть какие прерывания обслуживают USB и зафиксировать их, а не 21,22,23

в данном случае зафиксировать так
echo 1 > /proc/irq/21/smp_affinity
echo 1 > /proc/irq/22/smp_affinity
echo 1 > /proc/irq/23/smp_affinity
зафиксируй и попробуй снова по копировать


Для автоматизации наваял скрипт, который детектит прерывания, на которых висят usb и указывает, какой процессор выполняет работу с ними, скопировал его в /usr/local/bin и засунул его в загрузку системы (прописал /usr/local/bin/setusbwrite в /etc/init.d/rc.local)
1
2
3
4
5
6
#!/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



Тэги:
+ 8 -
Похожие Поделиться

ner_uto 18.01.2010 12:11 #
но потом она падает до ~500-700 кбайт/с и система начинает довольно сильно тормозить. Причем тормоза настолько сильные, что иногда иксы виснут намертво на несколько минут.

Кстати, в ubuntu часто тоже бывала такая фигня. Не уверен, что причина та же, но факт есть факт - при копировании начинала дергаться рывками мышь и даже виснуть иксы...
digiwhite 18.01.2010 14:28 #
известная ерунда-надо использовать другой IO планировщик, проблема обсуждалась на многих форумах.
evgenyl 18.01.2010 12:37 #
Видел 2 причины, плохой кабель либо слишком длинный.

И вторая копируеш объем больше чем кол-во опертивки смотриш htop и там увидиш что почемуто буфер вытесняет иксы и всесь софт в своп :(

имхо у тебя 2я причина
evgenyl 18.01.2010 13:35 #
Написал внятный ответ и получил минус :), спасибо, отбивает желание вообще комунибуть чем нибуть помогать :\
exelens 18.01.2010 14:33 #
Не нужно обижаться, возможно просто не туда ткнули.
Это бывает.
Shtsh 18.01.2010 14:01 #
Глюки возникают при подключении в любой usb-разъём. К тому же под виндами глюков не наблюдалось. Проблема не аппаратная
У меня 4 гига оперативки. Файлы гиг-полтора
evgenyl 18.01.2010 14:11 #
всетаки проверь если не трудно, растет ли своп когда копируеш
еще попробуй примонтировать флэшку с опцией sync и будут ли тормоза в таком режиме ?
Shtsh 18.01.2010 14:35 #
с опцией sync скорость сразу низкая и интерфейс тормозит.
Насчет свопа чуть попозже проверю.
Но на одном компе, где 4 гига ОЗУ, свопа нету, и памяти дофига свободной, а тормоза есть
evgenyl 18.01.2010 14:46 #
Если с sync тормозит интерфейс своп можеш не проверять дело не в нем.

digiwhite написал про планировщик попробуй поменяй

Если не поможет, проверь, возможно стоит управление питанием, проц меняет частоту налету, это мешает работе usb, можно просто посмотреть cat /proc/cpuinfo если не максимальная значить меняется

Еще бывает так что флэшки форматированны без таблицы разделов прям сразу /dev/sda
а вообще попробуй переворматировать ее под линуксом сделать новую таблицу разделов и заного отформатировать раздел. Бывает такое тоже помогает.
У меня 2 transcend флэшки, если под виндой форматировать, под линуксом страшно глючат, почему хз :\
Shtsh 18.01.2010 15:00 #
мои флешки монтируется через pmount руками
разделы как полагается /dev/sdb1 и т. п.
форматировал и под виндой, и чере mkfs.vfat - не помогает
На домашнем компе не стоит никаких демонов, меняющих частоту. Я так понимаю, что-то вроде cpufrecutils или fanspeed.
В том-то и дело, что, вроде, причины и нету :(
evgenyl 18.01.2010 15:11 #
не демонов не нужно никаких, ядро само умеет без демонов, это если говернер userspace стоит тогда демон будет менять
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

еще покажи свой cat /proc/interrupts
Shtsh 18.01.2010 15:28 #
oni ~ $ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat: /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor: Нет такого файла или каталога

oni ~ $ cat /proc/interrupts
CPU0 CPU1
0: 44 0 IO-APIC-edge timer
1: 1990 160359 IO-APIC-edge i8042
4: 0 2 IO-APIC-edge
6: 0 4 IO-APIC-edge floppy
7: 1 0 IO-APIC-edge parport0
8: 0 0 IO-APIC-edge rtc0
9: 0 0 IO-APIC-fasteoi acpi
14: 2974 283760 IO-APIC-edge ide0
20: 9023 1109893 IO-APIC-fasteoi ahci, nvidia
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
31: 5093 506109 PCI-MSI-edge eth0
NMI: 0 0 Non-maskable interrupts
LOC: 11215761 9488630 Local timer interrupts
SPU: 0 0 Spurious interrupts
PMI: 0 0 Performance monitoring interrupts
PND: 0 0 Performance pending work
RES: 12108215 10930624 Rescheduling interrupts
CAL: 3167 18261 Function call interrupts
TLB: 26722 25399 TLB shootdowns
TRM: 0 0 Thermal event interrupts
THR: 0 0 Threshold APIC interrupts
MCE: 0 0 Machine check exceptions
MCP: 55 55 Machine check polls
ERR: 1
MIS: 0

evgenyl 18.01.2010 15:33 #
Если нет файла значить не меняет частоту
Планировщик IO менял ? или незнаеш как ?
можно попробовать привязать прерывания 21,22,23 на 0й проц

нужно отлучится попозже напишу как.
Shtsh 18.01.2010 15:37 #
все ядра, на которых проверялись - дефолтные от дистрибутивов. То есть там планировщик по-умолчанию
evgenyl 18.01.2010 17:22 #
так прерывания зафиксировать так
echo 1 > /proc/irq/21/smp_affinity
echo 1 > /proc/irq/22/smp_affinity
echo 1 > /proc/irq/23/smp_affinity
зафиксируй и попробуй снова по копировать

по поводу планировщика
cat /sys/block/sda/queue/scheduler
будет чтото вроде
noop deadline
это значить есть noop, deadline, а сейчас активен cfq
можно поменять для sda например
echo noop > /sys/block/sda/queue/scheduler
Shtsh 18.01.2010 17:40 #
Вроде первое помогло. большое спасибо.
А где поподробнее можно почитать, что было сделано?
evgenyl 18.01.2010 17:47 #
Ты поставл маски на обработку прерываний 21,22,23 чтобы они обрабатывались только на 0ом процессоре
выше ты мне присылал
cat /proc/interrupts
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, когда копируеш, прерывания балансируются между процессорами, скорее всего блок памяти при передачи прерывания один и процессоры поочередности к нему обращаются, тем самым вызывая глобальную блокировку

почитать какуюнибуть книгу о ядре тут вроде ктото недавно давал ссылку на подобную
evgenyl 18.01.2010 17:51 #
Только смотри, на других машинах нужно посмотреть какие прерывания обслуживают USB и зафиксировать их, а не 21,22,23
digiwhite 18.01.2010 17:53 #
Вы могли бы более точно и полнее описать решение, которое вам помогло и убрать его под кат?

Так вы и для себя более четко уясните что и как и остальным будет потом проще понять, что произшло.
drujebober 18.01.2010 12:56 #
Но, может, это просто у меня руки кривые.

нет, это у девелоперов ядра они кривые, и такое ощущение что с каждым ядром их выкручивает все больше и больше, я сам подумываю поставить какое нибудь 2.16 ядро, с ним у меня самые положительные ассоциации
Shtsh 18.01.2010 14:02 #
Как вариант, возможно на дефолтных ядрах что-то отключено. Вопрос тогда в том, что же нужно включить при перекомпилляции
digiwhite 18.01.2010 14:24 #
Тормоза интерфейса могут быть обусловлены испольщуемым планировщиком ввода/вывода. Но т.к. еще и скорость записи низкая....
xT 18.01.2010 14:38 #
на любой флешке или только на какой-то одной?
Shtsh 18.01.2010 14:40 #
пробовал штуках на пяти. На всех грустно. На некоторых чуть быстрее, на некоторых медленее. Но везде всё плохо
xT 18.01.2010 14:45 #
они точно как усб2.0 работают в линухе? )
Shtsh 18.01.2010 15:05 #
читает с них как полагается > 10 мбайт/с
Есть подозрение, что копать нужно в сторону чипсета
galaxyman 18.01.2010 15:54 #
подтверждаю, испытано на десктопе и 2-ух ноутах (сейчас везде стоит Ubuntu 9.10): был acer 5315, сейчас HP2140 и на разных флешках, при записи больших файлов по 300-1400 Мб скорость сначала в несколько Мбит, потом скатывается на сотни кбит, и началось это дело еще в Ubuntu 8.10
а вот запись на USBhdd с ntfs идет с нормальной более менее стабильной скоростью...
Shtsh 18.01.2010 16:04 #
Угу, жесткий диск внешний работает хорошо. Хотя при копировании двух фильмов по 6 гигов, к концу скорость тоже упала. Но тормозов не было. И это было написано в оффициальном факе ntfs-3g. Так что это можно считать нормальным и виной была старая версия драйвера.
gen1s 18.01.2010 21:07 #
А мне что-то данное решение (с фиксацией прерываний) не помогло. Блин, на флешку из Linux даже трёхгигабайтный файл не передашь. Только у меня не X-ы падают, а отрубается wi-fi.
Что-то мне кажется, что на 2.6.31 такой проблемы не было. Я не помню, чтобы я мучался с записью файла.
exelens 19.01.2010 09:45 #
Блин, на флешку из Linux даже трёхгигабайтный файл не передашь.

файловая система флешки?
evgenyl 19.01.2010 10:43 #
вниз пробуй все что я писал
и по каждому пункту симптомы плюс немного больше информации что за машина сколько процов оперативки ?
Murz 19.01.2010 09:20 #
У меня под Ubuntu была такая же проблема, но решилась (вроде бы) по-другому, по инфе из длинного бага http://bugs.launchpad.net/ubuntu/+source/gvfs/+bug/197762?comments=all
Добавил в загрузку ядра параметр "elevator=noop" - после этого пока что проблемы не замечал, скорость записи на флешки стабильная.
Shtsh 19.01.2010 10:16 #
Для автоматизации наваял скрипт, который детектит прерывания и указывает, какой процессор выполняет работу с прерываниями, на которых "висят" usb и засунул его в загрузку системы
#!/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
alex_eri 11.04.2010 13:17 #
ubuntu 10.4, один процессор

мне не помогают не прерывания, не elevator=noop

система просто зависает при записи на флешку пока все не запишет, не отвиснет.
еще mkfs виснет в ожидании синхронизации и так не создает фс
Shtsh 16.04.2010 13:11 #
Пробуй играться с настройками usb в BIOS. Особенно стоит посмотреть на опцию Usb legacy support
alex_eri 16.04.2010 15:50 #
спасибо- попробую
kovtunos 26.09.2011 16:32 #
noop помог.
Спасибо за внятное объяснение проблемы и пути её решения.