Многие слышали о различных оптимизированных и улучшенных ядрах, это — Zen Kernel и pf-kernel из известных мне. Кроме того, что они добавляют новые возможности (TuxOnIce, поддержка aufs), они могут улучшить производительность, благодаря улучшенному менеджеру задач (BFS) и планировщику (BFQ). В этом топике я хочу сравнить производительность pf-kernel со стандартными ядрами в Ubuntu и Arch Linux, а также описать процесс сборки и установки pf-kernel для Ubuntu. Тестировать Zen Kernel я не вижу особого смысла, т.к. во-первых, проект выглядит заброшенным, а во-вторых, набор патчей и там и там очень похожий.
Тесты
Arch Linux
Начнем с теста Arch Linux на нетбуке.
Результаты теста UnixBench на стандартном ядре (3.0-ARCH):
| Test |
Score |
Unit |
Time |
Iters. |
Baseline |
Index |
| Dhrystone 2 using register variables |
3432673.5 |
lps |
10.0 s |
7 |
116700.0 |
294.1 |
| Double-Precision Whetstone |
821.7 |
MWIPS |
10.2 s |
7 |
55.0 |
149.4 |
| Execl Throughput |
1048.3 |
lps |
29.7 s |
2 |
43.0 |
243.8 |
| File Copy 1024 bufsize 2000 maxblocks |
120834.3 |
KBps |
30.0 s |
2 |
3960.0 |
305.1 |
| File Copy 256 bufsize 500 maxblocks |
36417.8 |
KBps |
30.0 s |
2 |
1655.0 |
220.0 |
| File Copy 4096 bufsize 8000 maxblocks |
290993.0 |
KBps |
30.0 s |
2 |
5800.0 |
501.7 |
| Pipe Throughput |
240124.9 |
lps |
10.0 s |
7 |
12440.0 |
193.0 |
| Pipe-based Context Switching |
21672.7 |
lps |
10.0 s |
7 |
4000.0 |
54.2 |
| Process Creation |
2885.9 |
lps |
30.0 s |
2 |
126.0 |
229.0 |
| Shell Scripts (1 concurrent) |
738.5 |
lpm |
60.0 s |
2 |
42.4 |
174.2 |
| Shell Scripts (8 concurrent) |
135.6 |
lpm |
60.4 s |
2 |
6.0 |
226.1 |
| System Call Overhead |
600176.7 |
lps |
10.0 s |
7 |
15000.0 |
400.1 |
| System Benchmarks Index Score: |
221.1 |
А вот тот же тест на pf-kernel (3.0-pf):
| Test |
Score |
Unit |
Time |
Iters. |
Baseline |
Index |
| Dhrystone 2 using register variables |
3700926.6 |
lps |
10.0 s |
7 |
116700.0 |
317.1 |
| Double-Precision Whetstone |
846.1 |
MWIPS |
10.2 s |
7 |
55.0 |
153.8 |
| Execl Throughput |
1343.2 |
lps |
29.6 s |
2 |
43.0 |
312.4 |
| File Copy 1024 bufsize 2000 maxblocks |
127468.0 |
KBps |
30.0 s |
2 |
3960.0 |
321.9 |
| File Copy 256 bufsize 500 maxblocks |
37622.9 |
KBps |
30.0 s |
2 |
1655.0 |
227.3 |
| File Copy 4096 bufsize 8000 maxblocks |
342606.2 |
KBps |
30.0 s |
2 |
5800.0 |
590.7 |
| Pipe Throughput |
296672.7 |
lps |
10.0 s |
7 |
12440.0 |
238.5 |
| Pipe-based Context Switching |
41227.5 |
lps |
10.0 s |
7 |
4000.0 |
103.1 |
| Process Creation |
3969.3 |
lps |
30.0 s |
2 |
126.0 |
315.0 |
| Shell Scripts (1 concurrent) |
861.1 |
lpm |
60.1 s |
2 |
42.4 |
203.1 |
| Shell Scripts (8 concurrent) |
159.4 |
lpm |
60.2 s |
2 |
6.0 |
265.6 |
| System Call Overhead |
642005.3 |
lps |
10.0 s |
7 |
15000.0 |
428.0 |
| System Benchmarks Index Score: |
264.6 |
Как видно, общий прирост производительности составил 20%.
Ubuntu
Теперь результаты этих же тестов, но у же для Ubuntu.
На стандартном ядре (2.6.38-11-generic):
| Test |
Score |
Unit |
Time |
Iters. |
Baseline |
Index |
| Dhrystone 2 using register variables |
39162082.2 |
lps |
10.0 s |
7 |
116700.0 |
3355.8 |
| Double-Precision Whetstone |
9143.1 |
MWIPS |
9.9 s |
7 |
55.0 |
1662.4 |
| Execl Throughput |
11472.2 |
lps |
29.8 s |
2 |
43.0 |
2668.0 |
| File Copy 1024 bufsize 2000 maxblocks |
1041722.3 |
KBps |
30.0 s |
2 |
3960.0 |
2630.6 |
| File Copy 256 bufsize 500 maxblocks |
327345.4 |
KBps |
30.0 s |
2 |
1655.0 |
1977.9 |
| File Copy 4096 bufsize 8000 maxblocks |
1730411.9 |
KBps |
30.0 s |
2 |
5800.0 |
2983.5 |
| Pipe Throughput |
4204868.3 |
lps |
10.0 s |
7 |
12440.0 |
3380.1 |
| Pipe-based Context Switching |
738528.0 |
lps |
10.0 s |
7 |
4000.0 |
1846.3 |
| Process Creation |
32309.9 |
lps |
30.0 s |
2 |
126.0 |
2564.3 |
| Shell Scripts (1 concurrent) |
11023.5 |
lpm |
60.0 s |
2 |
42.4 |
2599.9 |
| Shell Scripts (8 concurrent) |
1425.4 |
lpm |
60.0 s |
2 |
6.0 |
2375.7 |
| System Call Overhead |
5723850.3 |
lps |
10.0 s |
7 |
15000.0 |
3815.9 |
| System Benchmarks Index Score: |
2580.4 |
На pf ядре (2.6.38-pf8):
| Test |
Score |
Unit |
Time |
Iters. |
Baseline |
Index |
| Dhrystone 2 using register variables |
71269301.5 |
lps |
10.0 s |
7 |
116700.0 |
6107.1 |
| Double-Precision Whetstone |
9175.2 |
MWIPS |
9.9 s |
7 |
55.0 |
1668.2 |
| Execl Throughput |
12014.6 |
lps |
30.0 s |
2 |
43.0 |
2794.1 |
| File Copy 1024 bufsize 2000 maxblocks |
1580881.5 |
KBps |
30.0 s |
2 |
3960.0 |
3992.1 |
| File Copy 256 bufsize 500 maxblocks |
428842.2 |
KBps |
30.0 s |
2 |
1655.0 |
2591.2 |
| File Copy 4096 bufsize 8000 maxblocks |
2315055.5 |
KBps |
30.0 s |
2 |
5800.0 |
3991.5 |
| Pipe Throughput |
4389021.4 |
lps |
10.0 s |
7 |
12440.0 |
3528.2 |
| Pipe-based Context Switching |
831655.8 |
lps |
10.0 s |
7 |
4000.0 |
2079.1 |
| Process Creation |
34789.6 |
lps |
30.0 s |
2 |
126.0 |
2761.1 |
| Shell Scripts (1 concurrent) |
11890.9 |
lpm |
60.0 s |
2 |
42.4 |
2804.5 |
| Shell Scripts (8 concurrent) |
1506.4 |
lpm |
60.0 s |
2 |
6.0 |
2510.7 |
| System Call Overhead |
5815793.6 |
lps |
10.0 s |
7 |
15000.0 |
3877.2 |
| System Benchmarks Index Score: |
3050.7 |
Прирост составил 18%, что на мой взгляд довольно ощутимо. Почему второй тест выдал чуть меньший результат? Скорее всего, дело в том, что тест проводился на x86_64 и в стандартном ядре было больше оптимизаций под архитектуру процессора, чем при ядре собранном под Pentium Pro на Intel Atom (SSE и прочие).
Как из этого всего видно, смысл в сборке своего ядра есть. Результаты примерно одинаковые на двух довольно разных процессорах: Intel Atom N270 и Core 2 Duo E8500.
Описывать процесс установки ядра для ARCH я не буду, он максимально прост. Я уверен, что для его пользователей это не составит труда.
Сборка и установка pf-kernel для Ubuntu
Качаем ядро своей версии с kernel.org. Внимание: качать нужно версию без стабилизационных патчей (в случае с 2.6.38.11 качать нужно просто 2.6.38).
Качаем pf-kernel для этой версии ядра
отсюда.
Распаковываем архивы и ставим патч.
patch -p1 < (адрес pfkernel патча)
Копируем свой конфиг в папку с ядром.
cp /boot/config-`uname -r` .config
При желании можно сделать localmodconfig, который отключит все лишние модули, это может сильно ускорить сборку ядра.
make localmodconfig
если будет ругаться на то что нет /sbin/lsmod
ln -s /bin/lsmod /sbin/lsmod
Настраиваем ядро
make menuconfig
Нужно включить BFS, BFQ и tuxonice при желании, а также во вкладке о процессоре стоит выбрать оптимизацию под свой процессор.
Ставим патч для ядер с kernel.org
sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
Очищаем директорию
make-kpkg clean
Собираем
CONCURRENCY_LEVEL=`getconf _NPROCESSORS_ONLN` fakeroot make-kpkg --initrd --append-to-version=-pf kernel_image kernel_headers
Вот собственно и все. Ставим ядро командой dpkg -i *.deb, перезагружаемся и выбираем его в загрузчике.
UPDATE:
Zen Kernel показал практически идентичный результат, местами чуть лучше, но в общем не более чем на 5%, а затем скрашился даже не завершив все тесты (время теста около 40 минут).
Некто
Mr.z очень сильно сомневался в правильности расчетов,
тут в таблице видно прирост показателей по каждому тесту, а также средний прирост, а не только прирост индекса. Цифры вышли практически полностью одинаковыми.
Для
IoGa,
WiseLord и
gnomeby — Сравнение ванильного ядра с ванильным собранным под свою архитектуру если и показало прирост производительности, то не больше уровня погрешности, разницы почти ни какой.
комментарии (62)