С недавних пор мной была обнаружена некоторая
странность при работе ядер из новой ветки 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.
Чего они там собаки понаписывали?