Довольно частой проблемой, встречающейся у пользователей linux, является проблема с записью на флешки.
Проблема заключается в том, что когда идёт запись на флешку, скорость очень низкая (сначала, когда пишет в кэш, всё хорошо, но потом она падает до ~500-700 кбайт/с и система начинает довольно сильно тормозить. Причем тормоза настолько сильные, что иногда иксы виснут намертво на несколько минут.
Как выяснилось эмпирически, это случается из-за переключения процессоров и блокировок при использовании общего блока памяти. Логично решение указать, чтобы процессоры не переключались при обработки прерываний, на которых находятся usb.
Сначала нужно узнать, какие прерывания используются usb
для этого делаем
1
2
3
4
|
grep usb /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 |
То есть, у нас используются прерывания 21,22,23
на каждое прерывание указывается на каком процессоре оно висит, за это отвечает параметр smp_affinity
1
2
3
4
5
6
|
cat /proc/irq/21/smp_affinity
3
cat /proc/irq/22/smp_affinity
3
cat /proc/irq/22/smp_affinity
3 |
Теперь, что это значит
3 в шестнадцатеричной системе = 00000000.00000011 в двоичной (так как ядро скомпилировано с поддержкой 16 процессоров)
то есть обрабатыватся на CPU0, CPU1
Если нам нужно указать, чтобы обработка шла только на CPU0, то нужно задать 00000000.00000001, то есть 1
Если же нужно указать, чтобы обработка шла только на CPU1, то нужно задать 00000000.00000010, то есть 2
Теперь укажем, что будем обрабатывать на CPU0 все прерывания с висящими на них usb, естественно, всё делать нужно под рутом
1
2
3
|
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 `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 |
В результате, запись идёт на скорости несколько Мбайт/с и ничего не тормозит.
-
никогда не замечал
-
-
Тебе повезло :) В интернете это довольно распространённый вопрос, и особо нету вразумительных ответов. У меня на нескольких компьютерах было
-
-
а у меня просто медленная флешка
-
-
просто у меня было плохо независимо от флешки :)
-
Оооо...
Это старая проблема.
Неужели это решение действительно заработает!
Сейчас попробую.
-
не работает
После команды
sudo echo 1 > /proc/irq/20/smp_affinity
Выдает сообщение
Файл существует: /proc/irq/20/smp_affinity
Запись стопорится на секунд 5-10, потом возобновляется.
Скрипт соответственно тоже не работает.
Жаль.
-
-
cat /proc/interrupts | grep usb и номера посмотри, туда и пиши. но мне скрипт не помог все равно.
-
-
1
2
3
4
|
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 через несколько секунд после начала а потом возобновляется.
-
-
Извиняюсь за ошибку при цитировании
-
А у вас многоядерный процессор?
-
-
Да
AMD Athlon(tm) 64 X2 Dual Core Processor 3800+
-
глупый вопрос. а как копируешь? можно попробовать измерить скорость при помощи
rsync --stats --progress что-нибудь_большое папка_с_флешкой
-
-
Копирую по разному как удобно в какой то момент времени. Иногда в Mc, но чаще в Dolphin Копировать > Вставить.
Сейчас измерю.
-
-
ну наконец то закачался попутно вешая систему.
Вот результат:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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
-
-
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
-
-
а почему тут usb висят на этих же прерываниях, что и sata?
Может, дело в этом? и, заметь, эти прерывания обрабатываются обоими ядрами. Почему? Не отправил туда 1 или 2?
-
-
а почему тут usb висят на этих же прерываниях, что и sata?
хороший вопрос, может и в этом.
Почему? Не отправил туда 1 или 2?
отправлял 1
-
-
отправлял, все делал как в инструкции.
-
-
отправлял, все делал как в инструкции.
1
2
3
|
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
-
-
Посылаю еще раз и ...
sudo su
[root@arch nick]# echo 1 > /proc/irq/22/smp_affinity
[root@arch nick]# echo 1 > /proc/irq/23/smp_affinity
[root@arch nick]# 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
22: 96815 120959 IO-APIC-fasteoi sata_nv, ohci_hcd:usb2
23: 334481 399386 IO-APIC-fasteoi sata_nv, ehci_hcd:usb1
естественно, ты же до этого копировал с обоими ядрами фильм, нужно чтобы были единицы и посмотреть, что будет после копирования с единицами
-
-
sudo su
[root@arch nick]# cat /proc/irq/22/smp_affinity
1
[root@arch nick]# 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
-
-
собственно, судя по всему, сейчас работает только одно ядро для этих прерываний. Мне мозгов хватает только предположить, что дело в том, что sata и usb на одном прерывании. Но чувствую, дело не в этом :( Потому что по идее, это не должно влиять
-
-
Спасибо что попытался помочь.
-
-
пожалуйста, будем надеяться, что сюда кто-то более умный заглянет...
-
Мдя.... И после этого мы все, включая меня, говорим, что Линукс давно готов к десктопу...
Секретутка например совсем другое подумает при слове "перерывания" ...
-
-
Папулька сказал, что даже в его молодости до такого количества абортов никто не доходил
(с) Экслер, Записки невесты программиста
-
Вот, вот... :)
-
У меня на Kubuntu Karmic проблема решилась сменой элеватора:
Задал в параметрах загрузки ядра
elevator=noop
и после этого скорость стала стабильной!
Ещё можно попробовать elevator=deadline, но пока время не нашёл потестить :(
-
-
Глядя на welinux, что-то стал задумываться: "Тут народ более адекватно решает проблемы, чем на многих форумах. Может какую-нибудь базу знаний замутить?":)
-
-
а почему бы и нет?
-
-
Дык ведь и я думаю, почему нет. Просто база знаний - это не так все просто :).
-
-
так exelens же что-то делает по этому поводу. нужно поинтересоваться, как там дела
-
-
Он вроде как по другому вопросу :).
-
-
Он вроде тот, кто это организовывает. Появится в джаббере - спрошу, что делать с этой идеей
-
Сразу не сориентировался, простите. Не надо было постить в теме, где уже вопрос в стадии[Решено], поэтому продублирую своё сообщение здесь.
С фиксированием прерываний вручную (не используя скрипта для автоматизации) ситуация с моей флешкой не изменилась. Даже обычный архив с нтфс-раздела (виндовый) на 400 Мб устаю ждать, когда докопируется.
Мне интересно, почему же с сентября месяца, когда я только поставил линукс, ничего подобного не наблюдалось. Только последний месяц (январь) стал таким ужасным для копирования файлов на флешку. У меня сейчас стоит убунту 9.10, копирую в Тунаре (xfce4).
Пока не понадобилось скопировать 4 Гиг-овый образ на флешку, она была форматирована в ФАТ. Переформатировал в нтфс, но это было месяца три назад, и после этого таких зависаний при копировании не наблюдалось, вплоть до последнего месяца.
-
-
Собственно, я сталкивался со следующими советами в Интернете.
1. Отключить в BIOS USB Legcy Support
2. Попробовать другие I/O шедулеры. Например, при загрузке передавать ядру параметр elevator=noop
Кстати, а если переключиться в консоль (например, Ctrl+Alt+F1) и скопировать mc, то что происходит?
-
-
Не понял про МС. В тту1 запустить МС и скопировать на флешку или с неё большой файл?
-
-
Да, запиши на флешку большой файл, только размер хотя бы гига 2
-
-
что-то страшное случилось :) - вся кирилица в МС превратилась в нечитаемые символы, рамки окон нарушились. Попытался через Ф5 сделать копирование, но чего-то на красном фоне вылезло и строчки из крякозяблов во всю длину экрана и невозможно понять о чём речь.
-
-
rsync --stats --progress что-нибудь_большое папка_с_флешкой
попробуй так измерить
вся кирилица в МС превратилась в нечитаемые символы, рамки окон нарушились.
Попробуй установить/запустить console-cyrillic
-
-
Установка консоли-кирилик ситуацию с крякозяблами не решила. Устанавливал в убунте, после переключения в тту1 и запуска МС те же самые нечитаемые символы вместо русских букв. При запуске консоли-кирилик в тту1 пишет, что неправильная команда или нот-фаунд.
Помимо этого ещё одна беда. Проблема с удалением файлов. Надо было место почистить на диске. Диск виндовый с нтфс. При удалении нескольких файлов разом, появлялось сообщение, что невозможно такой-то файл скопировать в корзину. Некоторые ссылки (где удаляемый файл размещается) в этом сообщении имели вид буквы-проценты (такое бывает когда ссылку с русской вики вставить в какой-нибудь простой блокнот). Несколько раз чистил корзину, удалял часть файлов, чистил корзину. Это разве нормально. Ладно. Удаляю ещё два файла 1.9 Гиг и 200 Мб (вместе отметил для удаления). 8 минут удалялись, при этом вся убунта так повисла, что даже намлук не реагировал, будто клава вырубилась. Однократное нажатие на кнопку "power" никакого эффекта не давало. Несколько однократных нажатий - и через несколько секунд диод намлука на клаве загорался, а курсор мыши мог чуть двигаться и снова в летаргический сон вся система.
Никаких экзекуций с системой не производил. Работаю в браузере, получаю почту, слушаю музыку, общаюсь по аське.
Неужели я поломал линукс? И что теперь делать? Переустановка убунты поможет?
-
-
А оформить отдельный пост с вопросом лучше не будет разве?
-
stop piping cats!
-
-
Поправил
1
2
3
4
5
6
7
|
#!/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
|
|
|
|
Последние посты
|
|
Последние комментарии
|
|
Изменения
|
|
Черновики (все)
|
|
Избранное (всё)
|
|
|