18.01.10 10:51 Shtsh

Есть вопрос!Медленная запись на 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



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

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

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

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

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

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

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

еще покажи свой cat /proc/interrupts
Shtsh 18.01.10 15:28 # +0
oni ~ $ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat: /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor: Нет такого файла или каталога
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

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.10 15:33 # +0
Если нет файла значить не меняет частоту
Планировщик IO менял ? или незнаеш как ?
можно попробовать привязать прерывания 21,22,23 на 0й проц

нужно отлучится попозже напишу как.
Shtsh 18.01.10 15:37 # +0
все ядра, на которых проверялись - дефолтные от дистрибутивов. То есть там планировщик по-умолчанию
evgenyl 18.01.10 17:22 # +2
так прерывания зафиксировать так
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 [cfq]
это значить есть noop, deadline, а сейчас активен cfq
можно поменять для sda например
echo noop > /sys/block/sda/queue/scheduler
Shtsh 18.01.10 17:40 # +0
Вроде первое помогло. большое спасибо.
А где поподробнее можно почитать, что было сделано?
evgenyl 18.01.10 17:47 # +2
Ты поставл маски на обработку прерываний 21,22,23 чтобы они обрабатывались только на 0ом процессоре
выше ты мне присылал
cat /proc/interrupts
1
2
3
  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.10 17:51 # +0
Только смотри, на других машинах нужно посмотреть какие прерывания обслуживают USB и зафиксировать их, а не 21,22,23
digiwhite 18.01.10 17:53 # +1
Вы могли бы более точно и полнее описать решение, которое вам помогло и убрать его под кат?

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

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

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

Посты Комментарии
Последние посты
Посты Комментарии
Последние комментарии
Посты Комментарии
Изменения
Посты Комментарии Изменения Черновики Избранное
Черновики (все)
Посты Комментарии Изменения Черновики Избранное
Избранное (всё)
Посты Комментарии Изменения Черновики Избранное
Лучшие блоги (все 96)
Элита (все 1987 из 151 города)

Новенькие: r0di0n, li55t, dncaps, Infernion, GYRY
welinux.ru