С недавних пор мной была обнаружена некоторая
странность при работе ядер из новой ветки 2.6. При интенсивном обращении к дисковому накопителю наблюдалась некоторая тормознутость. Сначала все списывалось на собственную реактивность, кривые руки, фазы луны и прочие вещи. Но потом это таки достало и я начал искать
где же тут грабли зарыты.

В качестве лирического отступления: в качестве графической оболочки я использую icewm. Классная красива штука, которую можно хорошо настроить. Не жрет ресурсов. Думаю всем хорошо известен маленький графический индикатор уровня загрузки процессора в правом нижнем углу.

Долго я промучался с тормознутостью FedoraCore2. Плюнул на все, обозвал криворуким себя и дистромэйкеров. Откатился на ASP9.2 Как вам известно, сей дистр сделан на основе FedoraCore1 и ядра 2.4.22. Сидел я там и радовался как все летает. Но в один прекрасный день мне захотелось
поэкспериментировать с 2.6.7. В общем скачал я его, скомпилил и поставил. И в тот-же день меня поразила одна неприятная фигня. При ядре 2.4.22 вышеупомянутый индикатор загруженности процессора при копировании больших
объемов информации показывал зеленым цветом небольшую активность в пределах 7-10%. При копировании же на ядре 2.6. это окошечко почти напрочь забивалось красным цветом!!! Оба-на, подумал я. DMA не завелось. Потом смотрю на скорость копирования и понимаю, что ни при каком PIO такой скорости быть не может. Гашу нафиг копирование. Делаю hdparm -t
/dev/hda. И вижу 52 мегабайта в секунду. Какое нафиг тут ПИО!!! Все летает. Даже чуть быстрее чем на 2.4. Делаю hdparm -i /dev/hda и вижу 

UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 

Все работает!! В одной консоли запускаю top, в другой копирование фильма в другую папку. Индикатор загруженности сразу покрывается красным. Гляжу в
top:

07:34:20 up 11:22, 5 users, load average: 0,68, 0,18, 0,13 
87 processes: 85 sleeping, 2 running, 0 zombie, 0 stopped 
CPU states: cpu user nice system irq softirq iowait idle 
total 3,7% 0,0% 14,5% 0,9% 0,0% 80,8% 0,0% 
Mem: 255872k av, 253736k used, 2136k free, 0k shrd, 632k buff 
106452k active, 117268k inactive 
Swap: 530104k av, 0k used, 530104k free 156200k cached 
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND 
13779 serg 18 0 6224 1840 5812 D 13,2 0,7 0:01 0 mc 
44 root 15 0 0 0 0 SW 1,0 0,0 0:02 0 kswapd0 
13403 serg 15 0 162M 14M 160M S 0,9 5,8 0:02 0 konsole 
1529 root 15 0 163M 21M 144M S 0,7 8,7 10:01 0 X 
43 root 15 0 0 0 0 SW 0,4 0,0 0:01 0 pdflush 
2009 serg 15 0 24816 8180 12904 S 0,4 3,1 0:24 0 xmms 

80% ресурса проца идет на ожидание ввода-вывода. Что за байда? Делаю reboot. Выбираю родное 2.4.22. Запускаю все то
же самое. Iowait по нулям. Общая загрузка не больше 10%. С тех пор много и-нета я перегуглил, спалил дохрена траффика. Подоставал людей на форумах. Облазил сайт Нвидия по поводу всего, что связано с чипсетами. Перепробовал кучу ядер ветки 2.6. и кучу патчей. Все оставалось как прежде. В последнее время частенько я начал встречать в нете мнение, что в ядрах 2.4. в idle писалось суммарное значение свободных ресурсов плюс ожидание ввода-вывода.
То есть просто в ядрах 2.6. индикация ресурсов проводится немного по другому и на производительность это влиять не должно. ХРЕН ВАМ!!! - сказал я и придумал эти тесты.

Тестирование 

Конфигурация системы: 
- AthlonXP Barton 2500+@3200+ 
- MB Asus A7N8X Nforce2 
- 256 Mb DDR400 NCP 
- Seagate Barracuda 120Gb 7200RPM 2Mb cache 
[serg@cherep temp]# hdparm -i /dev/hda 
/dev/hda: 
Model=ST3120022A, FwRev=3.06, SerialNo=5JT03EF9 
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } 
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4 
BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=16 
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=234441648 
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} 
PIO modes: pio0 pio1 pio2 pio3 pio4 
DMA modes: mdma0 mdma1 mdma2 
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 
AdvancedPM=no WriteCache=enabled 
Drive conforms to: ATA/ATAPI-6 T13 1410D revision 2: 
* signifies the current active mode 

Тесты: 

1. Информация про скорость считывания с носителя hdparm -t
/dev/hda. Делается три раза и берется средний результат.

2. Измерение времени копирования файла 1.avi размером 719754K в файл 2.avi,
организовано скриптом copy:
[serg@cherep temp]# cat copy 
time cp 1.avi 2.avi 
rm 2.avi 
Измерения делаются 3 раза и берется средний результат.

3. Измерения времени распаковки архива ядра 2.6.8.1,
организовано скриптом unpack:
[serg@cherep temp]# cat unpack 
time bzip2 -cd linux-2.6.8.1.tar.bz2 | tar xvf - 
rm -rf linux-2.6.8.1 
Измерения делаются 3 раза и берется средний результат.

4. Самый главный тест. Его целью является выявить как сказывается на
производительности системы под разными ядрами работа с диском. Для этого
загружаем комп копированием с помощью скрипта copy1:
[serg@cherep temp]# cat copy1 
cp 1.avi 2.avi 
rm 2.avi 
./copy1 
И в это время запускаем на компиляцию ядро 2.6.8.1 и измеряем время его компиляции: 
time make bzImage 
Для интереса замеряем чистое время компиляции ядра без дополнительных нагрузок: 
time make bzImage 
(без запущенного copy1) 

Конфиг в каждом случае один и тот-же. Каталог каждый раз перед сборкой чистится mrproper.
Этот тест нехило напрягает веник 🙂 Поэтому если вы не уверены в его надежности и достаточном
охлаждении - прошу не повторять.

Тестировались ядра: 

2.4.22 - родное ядро из коробки ASP 9.2 
2.4.22 - собранное с оптимизацией под конкретную систему 
2.4.27 - последнее стабильное ядро в ветке 2.4. 
2.6.8.1 - последнее стабильное ядро в ветке 2.6. 

Примечания: 

Все это производилось в голой консоли без иксов. Все ненужные демоны типа roftpd были выключены (дабы никакая падла не испортила эксперимента скачкой фильмов), сетевые интерфейсы погашены. /В соседней консоли
через mpg312 играл Мастер/

Результаты тестов 

kelnel 2.4.22 asp9.2 native 

Тест #1: 
[serg@cherep serg]# hdparm -t /dev/hda 
/dev/hda: 
Timing buffered disk reads: 154 MB in 3.02 seconds = 50.99 MB/sec 

Тест #2: 
[serg@cherep temp]# ./copy 
real 0m31.627s 
user 0m0.020s 
sys 0m3.530s 

Тест #3: 
[serg@cherep temp]#./unpack 
real 0m35.206s 
user 0m19.140s 
sys 0m2.060s 

Тест #4: 
Запускаем с другой консоли copy1 для нагрузки диска. 
Заходим в /usr/src/linux-2.6.8.test 
make mrproper 
cp /mnt/all/.config /usr/src/linux-2.6.8.test/.config 
make oldconfig 
time make bzImage 
Получаем: 
Kernel: arch/i386/boot/bzImage is ready 
298.950u 32.860s 10:23.81 56.0% 0+0k 0+0io 2364358pf+0w 
Гасим copy1 
Заходим в /usr/src/linux-2.6.8.test 
make mrproper 
cp /mnt/all/.config /usr/src/linux-2.6.8.test/.config 
make oldconfig 
time make bzImage 

Получаем: 
Kernel: arch/i386/boot/bzImage is ready 
289.950u 22.860s 5:35.81 96.0% 0+0k 0+0io 2364358pf+0w 

Итак, под нагрузкой постоянного копирования
большого файла ядро обирается в два раза медленнее - 10m23s против 5m35s 

kernel 2.4.22my 

Тест #1: 
[serg@cherep temp]# hdparm -t /dev/hda 
/dev/hda: 
Timing buffered disk reads: 152 MB in 3.00 seconds = 50.67 MB/sec 

Тест #2: 
[serg@cherep temp]# ./copy 
real 0m33.848s 
user 0m0.020s 
sys 0m3.320s 

Тест #3: 
[serg@cherep temp]#./unpack 
real 0m35.121s 
user 0m19.120s 
sys 0m1.830s 

Тест #4: 
Запускаем с другой консоли copy1 для нагрузки диска. 
Заходим в /usr/src/linux-2.6.8.test 
make mrproper 
cp /mnt/all/.config /usr/src/linux-2.6.8.test/.config 
make oldconfig 
time make bzImage 
Получаем: 
Kernel: arch/i386/boot/bzImage is ready 
298.860u 32.490s 10:22.20 54.1% 0+0k 0+0io 2364374pf+0w 
Гасим copy1 
Заходим в /usr/src/linux-2.6.8.test 
make mrproper 
cp /mnt/all/.config /usr/src/linux-2.6.8.test/.config 
make oldconfig 
time make bzImage 
Получаем: 
Kernel: arch/i386/boot/bzImage is ready 
289.930u 23.230s 5:30.94 94.6% 0+0k 0+0io 2364358pf+0w 

Практически аналогичная картина. Разница почти в два раза. 

kernel 2.4.27 

Тест #1: 
[serg@cherep temp]# hdparm -t /dev/hda 
/dev/hda: 
Timing buffered disk reads: 152 MB in 3.02 seconds = 50.33 MB/sec 

Тест #2: 
[serg@cherep temp]# ./copy 
real 0m31.915s 
user 0m0.050s 
sys 0m3.780s 

Тест #3: 
[serg@cherep temp]#./unpack 
real 0m35.084s 
user 0m19.260s 
sys 0m2.180s 

Тест #4: 
Запускаем с другой консоли copy1 для нагрузки диска. 
Заходим в /usr/src/linux-2.6.8.test 
make mrproper 
cp /mnt/all/.config /usr/src/linux-2.6.8.test/.config 
make oldconfig 
time make bzImage 
Получаем: 
Kernel: arch/i386/boot/bzImage is ready 
299.170u 31.160s 10:24.41 52.0% 0+0k 0+0io 2364358pf+0w 
Гасим copy1 
Заходим в /usr/src/linux-2.6.8.test 
make mrproper 
cp /mnt/all/.config /usr/src/linux-2.6.8.test/.config 
make oldconfig 
time make bzImage 
Получаем: 
Kernel: arch/i386/boot/bzImage is ready 
289.300u 19.230s 5:20.83 96.1% 0+0k 0+0io 2364358pf+0w 

Передовой представитель ветки 2.4. показал тут себя с лучшей
стороны 
5m20s - без нагрузки 
10m24s - с нагрузкой постоянного копирования. 

kernel 2.6.8.1 

Тест #1: 
[serg@cherep temp]# hdparm -t /dev/hda 
/dev/hda: 
Timing buffered disk reads: 160 MB in 3.02 seconds = 52.99 MB/sec 

Тест #2: 
[serg@cherep temp]# ./copy 
real 0m32.242s 
user 0m0.054s 
sys 0m3.941s 

Тест #3: 
[serg@cherep temp]#./unpack 
real 0m33.128s 
user 0m20.900s 
sys 0m2.804s 

Тест #4: 
Запускаем с другой консоли copy1 для нагрузки диска. 
Заходим в /usr/src/linux-2.6.8.test 
make mrproper 
cp /mnt/all/.config /usr/src/linux-2.6.8.test/.config 
make oldconfig 
time make bzImage 

И тут началась тоска. Все происходило медленно 🙁 
Получаем: 
Kernel: arch/i386/boot/bzImage is ready 
312.015u 29.249s 33:00.41 17.2% 0+0k 0+0io 20338pf+0w 
Больше чем полчаса!!!!! 
Гасим copy1 
Заходим в /usr/src/linux-2.6.8.test 
make mrproper 
cp /mnt/all/.config /usr/src/linux-2.6.8.test/.config 
make oldconfig 
time make bzImage 
Получаем: 
Kernel: arch/i386/boot/bzImage is ready 
312.469u 24.310s 5:18.20 94.0% 0+0k 0+0io 557pf+0w 
Тут все в норме. 

Видим результаты и чухаем голову 🙁 Почти в 6 раз быстрее без нагрузки на винт. 

Результирующая таблица 

test1 test2 test3 test4
2.6.8.1 52.99 MB/sec 32s 33s 33m0s/5m18s
2.4.22 50.99 MB/sec 32 35 10m23s/5m35s
2.4.22my 50.67 MB/sec 34s 35s 10m22s/5m35s
2.4.27 50.33 MB/sec 32s 35s 10m24s/5m20s

Результаты: 

Видно, что 2.6. чуток пошустрее. Но работа с диском безбожно жрет ресурсы процессора. Там где ядра 2.4. справлялись за 10 минут, 2.6. понадобилось в три раза больше времени. Таки iowait тратится впустую некорректно отбирая ресурсы. Что-то не так в Датском королевстве. Это у меня один жесткий диск и быстрый проц - так что все не так критично. А у других: не каждый пользователь будет одновременно компилить ядро и перемещать большие массивы информации. Так что большинство этой баги даже не заметят и буду радоваться шустрости новой ветки. Но я себе представляю что будет когда начнут массово переводить серваки на новую ветку 🙂 Пол дюжины сказевников - никаких там дуалксеонов не хватит что-бы нормально
поддерживать работу Рэйд и прочих массивов дисковой подсистемы. Хорошая нагрузочка на такую машину - и там где ядра 2.4. спокойно себе держались 2.6. будут попадать в попу 🙂

Выводы: 

- Пока go-go-go на 2.4.27 
- Думать головой в чем все-же проблема 
- Подождать еще пару версий, мож че-то исправится в 2.6. 
- Есть еще дурная идея попробовать в исходники 2.6. подсунуть драйвера для ide из 2.4. 🙂 Интересно, скомпилится ли. 

P.S. А вот и первые ласточки 🙂 У народа начинают жутко тормозить серваки. 

http://forums1.itrc.hp.com/service/forums/questionanswer.do?admit=716493758+1096779815623+28353475&threadId=698048 
http://lkml.org/lkml/2004/4/16/153 
http://www.linuxquestions.org/questions/history/230630 

P.P.S. И напоследок самое плохое: 

http://linux.derkeiler.com/Mailing-Lists/Kernel/2003-11/417index.html 

В конце прошлого года всплывала похожая проблема на 2.6.0test ядрах для каких-то конкретных сказевников.
В обсуждении участвовали: 
Пауль Вэнэйза у которого были проблемы с серваком на 2.6. 
Эндрю Мортон - имеет вроде некоторое отношение к разработке ядер и написанию патчей 
Линус Торвальдс - он самый, папа Линукса. 
Они там так ничего и не выяснили. Подумали что дело в драйверах именно для этих сказевников и пообещали наехать на разработчиков. Пауль Вэнэйза забил на все и откатился на 2.4.

Вот так вот 🙁 

P.P.P.S. дисковой подсистемой при работе рулит драйвер который компилится из 
/usr/src/linux-бла-бла-бла/drivers/ide/ide-disk.c 
Так вот, во всех 2.4. версия 1.17 или ниже. 
Во всех 2.6. версия этих ИДЕдров 1.18 или выше.
И самое западло в том, что не указано что нового в версии 1.18. 

Чего они там собаки понаписывали?

Теги:

Check Also

Исходный кот. Как заставить нейронную сеть ошибиться

Нейросети теперь повсюду, и распознавание объектов на картинках — это одно из самых популя…

Оставить мнение