Shtsh 22.01.2010 14:51
How-to`s — Решение проблемы с медленной записью на USB Flash drive
Довольно частой проблемой, встречающейся у пользователей linux, является проблема с записью на флешки.Проблема заключается в том, что когда идёт запись на флешку, скорость очень низкая (сначала, когда пишет в кэш, всё хорошо, но потом она падает до ~500-700 кбайт/с и система начинает довольно сильно тормозить. Причем тормоза настолько сильные, что иногда иксы виснут намертво на несколько минут.
Как выяснилось эмпирически, это случается из-за переключения процессоров и блокировок при использовании общего блока памяти. Логично решение указать, чтобы процессоры не переключались при обработки прерываний, на которых находятся usb.
Сначала нужно узнать, какие прерывания используются usb
для этого делаем
1 |
grep usb /proc/interrupts
|
То есть, у нас используются прерывания 21,22,23
на каждое прерывание указывается на каком процессоре оно висит, за это отвечает параметр smp_affinity
1 |
|
Теперь, что это значит
3 в шестнадцатеричной системе = 00000000.00000011 в двоичной (так как ядро скомпилировано с поддержкой 16 процессоров)
то есть обрабатыватся на CPU0, CPU1
Если нам нужно указать, чтобы обработка шла только на CPU0, то нужно задать 00000000.00000001, то есть 1
Если же нужно указать, чтобы обработка шла только на CPU1, то нужно задать 00000000.00000010, то есть 2
Теперь укажем, что будем обрабатывать на CPU0 все прерывания с висящими на них usb, естественно, всё делать нужно под рутом
1 |
echo 1 > /proc/irq/21/smp_affinity
|
Так как прерывания могут быть разными, то нужно либо вручную их узнавать и указывать, или написать скрипт и добавить его в автозагрузку.
Собственно, вот скрипт, который детектит прерывания, на которых висят usb и указывает, какой процессор выполняет работу с ними. Нужно скопировать его в /usr/local/bin и засунуть его в загрузку системы (например, прописать /usr/local/bin/setusbwrite в /etc/init.d/rc.local)
В результате, запись идёт на скорости несколько Мбайт/с и ничего не тормозит.
predator 22.01.2010 15:07 #
+ 0 -
никогда не замечал
Тебе повезло :) В интернете это довольно распространённый вопрос, и особо нету вразумительных ответов. У меня на нескольких компьютерах было
Оооо...
Это старая проблема.
Неужели это решение действительно заработает!
Сейчас попробую.
Это старая проблема.
Неужели это решение действительно заработает!
Сейчас попробую.
не работает
После команды
Выдает сообщение
Запись стопорится на секунд 5-10, потом возобновляется.
Скрипт соответственно тоже не работает.
Жаль.
После команды
sudo echo 1 > /proc/irq/20/smp_affinity
Выдает сообщение
Файл существует: /proc/irq/20/smp_affinity
Запись стопорится на секунд 5-10, потом возобновляется.
Скрипт соответственно тоже не работает.
Жаль.
cat /proc/interrupts | grep usb и номера посмотри, туда и пиши. но мне скрипт не помог все равно.
cat /proc/interrupts | grep usb
20: 118 22083 IO-APIC-fasteoi ehci_hcd:usb1
23: 294 135747 IO-APIC-fasteoi sata_nv, ohci_hcd:usb2
во-первых, просто с sudo работать не будет делай сначала sudo su
во-вторых, сначала посмотри, действительно ли это твои прерывания
во-вторых, сначала посмотри, действительно ли это твои прерывания
во-первых, просто с sudo работать не будет делай сначала sudo su
Прерывания мои
во-первых, просто с sudo работать не будет делай сначала sudo su
Действительно через su сообщений об ошибке не выдает, но ситуация не изменилась - скорость записи скатывается к 0 через несколько секунд после начала а потом возобновляется.
глупый вопрос. а как копируешь? можно попробовать измерить скорость при помощи
rsync --stats --progress что-нибудь_большое папка_с_флешкой
Копирую по разному как удобно в какой то момент времени. Иногда в Mc, но чаще в Dolphin Копировать > Вставить.
Сейчас измерю.
Сейчас измерю.
ну наконец то закачался попутно вешая систему.
Вот результат:
Вот результат:
rsync --stats --progress /mnt/2hard/Video2/Фильмы/Детектив/Шерлок_Холмс_Sherlock_Holmes_2009_DVDScr.avi /media/disk/
Шерлок_Холмс_Sherlock_Holmes_2009_DVDScr.avi
2200547328 100% 766.41kB/s 0:46:43 (xfer#1, to-check=0/1)
Number of files: 1
Number of files transferred: 1
Total file size: 2200547328 bytes
Total transferred file size: 2200547328 bytes
Literal data: 2200547328 bytes
Matched data: 0 bytes
File list size: 71
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 2200816069
Total bytes received: 31
sent 2200816069 bytes received 31 bytes 767771.18 bytes/sec
total size is 2200547328 speedup is 1.00
cat /proc/interrupts | grep usb
22: 88055 120959 IO-APIC-fasteoi sata_nv, ohci_hcd:usb2
23: 303862 399386 IO-APIC-fasteoi sata_nv, ehci_hcd:usb1
22: 88055 120959 IO-APIC-fasteoi sata_nv, ohci_hcd:usb2
23: 303862 399386 IO-APIC-fasteoi sata_nv, ehci_hcd:usb1
а почему тут usb висят на этих же прерываниях, что и sata?
Может, дело в этом? и, заметь, эти прерывания обрабатываются обоими ядрами. Почему? Не отправил туда 1 или 2?
Может, дело в этом? и, заметь, эти прерывания обрабатываются обоими ядрами. Почему? Не отправил туда 1 или 2?
а почему тут usb висят на этих же прерываниях, что и sata?
хороший вопрос, может и в этом.
Почему? Не отправил туда 1 или 2?
отправлял 1
отправлял, все делал как в инструкции.
sudo su
echo 1 > /proc/irq/22/smp_affinity
echo 1 > /proc/irq/23/smp_affinity
если послал бы туда 1, второе и третье значения были что-то вроде
20: 76052 27 IO-APIC-fasteoi ohci_hcd:usb2
21: 18030 3 IO-APIC-fasteoi ehci_hcd:usb1
Видишь, у меня обрабатываются только 1м процем (первое значение намного больше второго). У тебя же работают оба ядра
если послал бы туда 1, второе и третье значения были что-то вроде
20: 76052 27 IO-APIC-fasteoi ohci_hcd:usb2
21: 18030 3 IO-APIC-fasteoi ehci_hcd:usb1
20: 76052 27 IO-APIC-fasteoi ohci_hcd:usb2
21: 18030 3 IO-APIC-fasteoi ehci_hcd:usb1
Посылаю еще раз и ...
sudo su
# echo 1 > /proc/irq/22/smp_affinity
# echo 1 > /proc/irq/23/smp_affinity
# exit
nick:~$ cat /proc/interrupts | grep usb
22: 96815 120959 IO-APIC-fasteoi sata_nv, ohci_hcd:usb2
23: 334481 399386 IO-APIC-fasteoi sata_nv, ehci_hcd:usb1
sudo su
# echo 1 > /proc/irq/22/smp_affinity
# echo 1 > /proc/irq/23/smp_affinity
# exit
nick:~$ cat /proc/interrupts | grep usb
22: 96815 120959 IO-APIC-fasteoi sata_nv, ohci_hcd:usb2
23: 334481 399386 IO-APIC-fasteoi sata_nv, ehci_hcd:usb1
сделай
cat /proc/irq/22/smp_affinity
cat /proc/irq/23/smp_affinity
естественно, ты же до этого копировал с обоими ядрами фильм, нужно чтобы были единицы и посмотреть, что будет после копирования с единицами
cat /proc/irq/22/smp_affinity
cat /proc/irq/23/smp_affinity
22: 96815 120959 IO-APIC-fasteoi sata_nv, ohci_hcd:usb2
23: 334481 399386 IO-APIC-fasteoi sata_nv, ehci_hcd:usb1
23: 334481 399386 IO-APIC-fasteoi sata_nv, ehci_hcd:usb1
естественно, ты же до этого копировал с обоими ядрами фильм, нужно чтобы были единицы и посмотреть, что будет после копирования с единицами
sudo su
# cat /proc/irq/22/smp_affinity
1
# cat /proc/irq/23/smp_affinity
1
# cat /proc/irq/22/smp_affinity
1
# cat /proc/irq/23/smp_affinity
1
запускаю копирование опять - та же песня: тормоза системы и уход скорости копирования в 0
это во время копирования которое сейчас происходит
cat /proc/interrupts | grep usb
22: 107800 120959 IO-APIC-fasteoi sata_nv, ohci_hcd:usb2
23: 391051 399386 IO-APIC-fasteoi sata_nv, ehci_hcd:usb1
cat /proc/interrupts | grep usb
22: 107800 120959 IO-APIC-fasteoi sata_nv, ohci_hcd:usb2
23: 391051 399386 IO-APIC-fasteoi sata_nv, ehci_hcd:usb1
собственно, судя по всему, сейчас работает только одно ядро для этих прерываний. Мне мозгов хватает только предположить, что дело в том, что sata и usb на одном прерывании. Но чувствую, дело не в этом :( Потому что по идее, это не должно влиять
пожалуйста, будем надеяться, что сюда кто-то более умный заглянет...
Мдя.... И после этого мы все, включая меня, говорим, что Линукс давно готов к десктопу...
Секретутка например совсем другое подумает при слове "перерывания" ...
Секретутка например совсем другое подумает при слове "перерывания" ...
Папулька сказал, что даже в его молодости до такого количества абортов никто не доходил
(с) Экслер, Записки невесты программиста
У меня на Kubuntu Karmic проблема решилась сменой элеватора:
Задал в параметрах загрузки ядра
elevator=noop
и после этого скорость стала стабильной!
Ещё можно попробовать elevator=deadline, но пока время не нашёл потестить :(
Задал в параметрах загрузки ядра
elevator=noop
и после этого скорость стала стабильной!
Ещё можно попробовать elevator=deadline, но пока время не нашёл потестить :(
Глядя на welinux, что-то стал задумываться: "Тут народ более адекватно решает проблемы, чем на многих форумах. Может какую-нибудь базу знаний замутить?":)
Дык ведь и я думаю, почему нет. Просто база знаний - это не так все просто :).
так exelens же что-то делает по этому поводу. нужно поинтересоваться, как там дела
Он вроде тот, кто это организовывает. Появится в джаббере - спрошу, что делать с этой идеей
Сразу не сориентировался, простите. Не надо было постить в теме, где уже вопрос в стадии<�Решено>, поэтому продублирую своё сообщение здесь.
С фиксированием прерываний вручную (не используя скрипта для автоматизации) ситуация с моей флешкой не изменилась. Даже обычный архив с нтфс-раздела (виндовый) на 400 Мб устаю ждать, когда докопируется.
Мне интересно, почему же с сентября месяца, когда я только поставил линукс, ничего подобного не наблюдалось. Только последний месяц (январь) стал таким ужасным для копирования файлов на флешку. У меня сейчас стоит убунту 9.10, копирую в Тунаре (xfce4).
Пока не понадобилось скопировать 4 Гиг-овый образ на флешку, она была форматирована в ФАТ. Переформатировал в нтфс, но это было месяца три назад, и после этого таких зависаний при копировании не наблюдалось, вплоть до последнего месяца.
С фиксированием прерываний вручную (не используя скрипта для автоматизации) ситуация с моей флешкой не изменилась. Даже обычный архив с нтфс-раздела (виндовый) на 400 Мб устаю ждать, когда докопируется.
Мне интересно, почему же с сентября месяца, когда я только поставил линукс, ничего подобного не наблюдалось. Только последний месяц (январь) стал таким ужасным для копирования файлов на флешку. У меня сейчас стоит убунту 9.10, копирую в Тунаре (xfce4).
Пока не понадобилось скопировать 4 Гиг-овый образ на флешку, она была форматирована в ФАТ. Переформатировал в нтфс, но это было месяца три назад, и после этого таких зависаний при копировании не наблюдалось, вплоть до последнего месяца.
Собственно, я сталкивался со следующими советами в Интернете.
1. Отключить в BIOS USB Legcy Support
2. Попробовать другие I/O шедулеры. Например, при загрузке передавать ядру параметр elevator=noop
Кстати, а если переключиться в консоль (например, Ctrl+Alt+F1) и скопировать mc, то что происходит?
1. Отключить в BIOS USB Legcy Support
2. Попробовать другие I/O шедулеры. Например, при загрузке передавать ядру параметр elevator=noop
Кстати, а если переключиться в консоль (например, Ctrl+Alt+F1) и скопировать mc, то что происходит?
Не понял про МС. В тту1 запустить МС и скопировать на флешку или с неё большой файл?
что-то страшное случилось :) - вся кирилица в МС превратилась в нечитаемые символы, рамки окон нарушились. Попытался через Ф5 сделать копирование, но чего-то на красном фоне вылезло и строчки из крякозяблов во всю длину экрана и невозможно понять о чём речь.
rsync --stats --progress что-нибудь_большое папка_с_флешкой
попробуй так измерить
Попробуй установить/запустить console-cyrillic
попробуй так измерить
вся кирилица в МС превратилась в нечитаемые символы, рамки окон нарушились.
Попробуй установить/запустить console-cyrillic
Установка консоли-кирилик ситуацию с крякозяблами не решила. Устанавливал в убунте, после переключения в тту1 и запуска МС те же самые нечитаемые символы вместо русских букв. При запуске консоли-кирилик в тту1 пишет, что неправильная команда или нот-фаунд.
Помимо этого ещё одна беда. Проблема с удалением файлов. Надо было место почистить на диске. Диск виндовый с нтфс. При удалении нескольких файлов разом, появлялось сообщение, что невозможно такой-то файл скопировать в корзину. Некоторые ссылки (где удаляемый файл размещается) в этом сообщении имели вид буквы-проценты (такое бывает когда ссылку с русской вики вставить в какой-нибудь простой блокнот). Несколько раз чистил корзину, удалял часть файлов, чистил корзину. Это разве нормально. Ладно. Удаляю ещё два файла 1.9 Гиг и 200 Мб (вместе отметил для удаления). 8 минут удалялись, при этом вся убунта так повисла, что даже намлук не реагировал, будто клава вырубилась. Однократное нажатие на кнопку "power" никакого эффекта не давало. Несколько однократных нажатий - и через несколько секунд диод намлука на клаве загорался, а курсор мыши мог чуть двигаться и снова в летаргический сон вся система.
Никаких экзекуций с системой не производил. Работаю в браузере, получаю почту, слушаю музыку, общаюсь по аське.
Неужели я поломал линукс? И что теперь делать? Переустановка убунты поможет?
Помимо этого ещё одна беда. Проблема с удалением файлов. Надо было место почистить на диске. Диск виндовый с нтфс. При удалении нескольких файлов разом, появлялось сообщение, что невозможно такой-то файл скопировать в корзину. Некоторые ссылки (где удаляемый файл размещается) в этом сообщении имели вид буквы-проценты (такое бывает когда ссылку с русской вики вставить в какой-нибудь простой блокнот). Несколько раз чистил корзину, удалял часть файлов, чистил корзину. Это разве нормально. Ладно. Удаляю ещё два файла 1.9 Гиг и 200 Мб (вместе отметил для удаления). 8 минут удалялись, при этом вся убунта так повисла, что даже намлук не реагировал, будто клава вырубилась. Однократное нажатие на кнопку "power" никакого эффекта не давало. Несколько однократных нажатий - и через несколько секунд диод намлука на клаве загорался, а курсор мыши мог чуть двигаться и снова в летаргический сон вся система.
Никаких экзекуций с системой не производил. Работаю в браузере, получаю почту, слушаю музыку, общаюсь по аське.
Неужели я поломал линукс? И что теперь делать? Переустановка убунты поможет?
Поправил
#!/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
Спасибо огромное, скорость возросла.
А в /etc/rc.local просто ссылка на скрипт сойдет? Ну, будет ли он выполняться с нужными правами при старте системы?
А в /etc/rc.local просто ссылка на скрипт сойдет? Ну, будет ли он выполняться с нужными правами при старте системы?
добавил в параметры ядра elevator=cfq, попутно отключил в биосе usb legacy support, использовал опции монтирования flush,async и скорость стала приемлемой - начинает с 30 Мбс и ооочень плавно снижается до 7-8 Мбс
а при переключении обработки прерываний на отдельное ядро скорость в самом начале 30 Мбс, потом небольшой ступор, потом 5-6, потом 1-2 и так с великим трудом ползет до конца...
ну и вот еще
chestr-gentoo chestr # grep usb /proc/interrupts
16: 43313 0 IO-APIC-fasteoi uhci_hcd:usb3, nvidia
18: 26090 0 IO-APIC-fasteoi pata_jmicron, ata_piix, ata_piix, ehci_hcd:usb1, uhci_hcd:usb7, eth0
19: 0 0 IO-APIC-fasteoi uhci_hcd:usb6
21: 0 0 IO-APIC-fasteoi uhci_hcd:usb4
23: 52417 0 IO-APIC-fasteoi ehci_hcd:usb2, uhci_hcd:usb5
щас проверял на юсб-хабе, напрямую в комп воткнуть щас нет возожности - далеко лезть, темно, шума много будет, а в таше щас 1:45 ночи... завтра вернусь с работы и проверю на портах матери, очень надеюсь что бага поправится...
ядро 3.0.6 амд64 - гента
ЗЫ грузанул как то раз для эксперимента убунту 9.10, так там все было в порядке, завтра грузану опять и посматрю какие там модули на каких прерываниях висят... и как с ядрами
а при переключении обработки прерываний на отдельное ядро скорость в самом начале 30 Мбс, потом небольшой ступор, потом 5-6, потом 1-2 и так с великим трудом ползет до конца...
ну и вот еще
chestr-gentoo chestr # grep usb /proc/interrupts
16: 43313 0 IO-APIC-fasteoi uhci_hcd:usb3, nvidia
18: 26090 0 IO-APIC-fasteoi pata_jmicron, ata_piix, ata_piix, ehci_hcd:usb1, uhci_hcd:usb7, eth0
19: 0 0 IO-APIC-fasteoi uhci_hcd:usb6
21: 0 0 IO-APIC-fasteoi uhci_hcd:usb4
23: 52417 0 IO-APIC-fasteoi ehci_hcd:usb2, uhci_hcd:usb5
щас проверял на юсб-хабе, напрямую в комп воткнуть щас нет возожности - далеко лезть, темно, шума много будет, а в таше щас 1:45 ночи... завтра вернусь с работы и проверю на портах матери, очень надеюсь что бага поправится...
ядро 3.0.6 амд64 - гента
ЗЫ грузанул как то раз для эксперимента убунту 9.10, так там все было в порядке, завтра грузану опять и посматрю какие там модули на каких прерываниях висят... и как с ядрами
У меня на втором этапе некая загвоздка.
sudo cat /proc/irq/22/smp_affinity
f
Процессор четырёхядерный AMD Phenom 9450e.
sudo cat /proc/irq/22/smp_affinity
f
Процессор четырёхядерный AMD Phenom 9450e.
Всё правильно. У тебя четыре ядра, f в 16-й системе 15, в двоичной 1111, то есть указано, что все четыре ядра могут обрабатывать это прерывание. В статью стоило бы добавить, что в smp_affinity значения идут в 16-й системе, тогда такого недопонимания бы не было.