Major changes since 10.04
The biggest change from 10.04 is that "server" flavour has been removed.
Ubuntu server now uses the "generic" flavour, the same kernel used in desktop edition.
Differences between server and generic flavours were described here.
Build our own server flavour
We need "server" flavour for 12.04 for best performance.
To build our own server flavour of the kernel, follow instructions below.
References:
- https://help.ubuntu.com/community/Kernel/Compile
- http://blog.avirtualhome.com/compile-linux-kernel-3-2-for-ubuntu-11-10/
Setup build environment
$ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo reboot (make sure the system is running the latest kernel) $ sudo apt-get install build-essential
Obtain the latest kernel sources
$ apt-cache search linux-image-3 virtual | sort | tail -1 | sed 's/-virtual.*$//' linux-image-3.2.0-25 $ sudo apt-get build-dep linux-image-3.2.0-25-generic $ apt-get source linux-image-3.2.0-25-generic
Create and modify configurations
$ cd linux-3.2.0/debian.master/config/amd64 $ cp config.flavour.generic config.flavour.server $ vi config.flavour.server (change I/O scheduler from CFQ to deadline. Disable voluntary preemption.) $ cat config.flavour.server # CONFIG_DEFAULT_CFQ is not set CONFIG_DEFAULT_DEADLINE=y CONFIG_DEFAULT_IOSCHED="deadline" CONFIG_INTEL_IDLE=y CONFIG_NR_CPUS=256 CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set $ sed -i 's/^CONFIG_HZ=250/CONFIG_HZ=100/' config.common.amd64 $ cd .. $ vi config.common.ubuntu (Edit HZ like this) CONFIG_HZ_100=y # CONFIG_HZ_1000 is not set # CONFIG_HZ_250 is not set # CONFIG_HZ_300 is not set $ cd ../.. $ chmod -R a+x debian/scripts/* $ ./debian/rules updateconfigs $ cd debian.master $ vi etc/getabis (append server flavour to amd64 arch like this) getall amd64 generic virtual server $ vi rules.d/amd64.mk (append server flavour to list of flavours like this) flavours = generic virtual server $ cp control.d/vars.generic control.d/vars.server $ vi control.d/vars.server (edit as you like) $ diff -u control.d/vars.generic control.d/vars.server --- control.d/vars.generic 2012-05-30 06:41:02.000000000 +0000 +++ control.d/vars.server 2012-05-30 07:02:14.952238628 +0000 @@ -1,6 +1,6 @@ arch="i386 amd64" -supported="Generic" -target="Geared toward desktop and server systems." +supported="Server" +target="Geared toward server systems." desc="=HUMAN= SMP" bootloader="grub-pc | grub-efi-amd64 | grub-efi-ia32 | grub | lilo (>= 19.1)" provides="kvm-api-4, redhat-cluster-modules, ivtv-modules, ndiswrapper-modules-1.9" $ cd ..
Apply patches
Apply a patch for LIO iSCSI target.
Obtain the patch from gist.github.com.
Build packages
$ fakeroot debian/rules clean $ skipabi=true skipmodule=true fakeroot debian/rules binary-indep (this will build kernel header package) $ DEB_BUILD_OPTIONS=parallel=8 skipabi=true skipmodule=true fakeroot debian/rules binary-server (this will build kernel image package) $ ls ../*.deb ../linux-doc_3.2.0-24.38_all.deb ../linux-headers-3.2.0-24_3.2.0-24.38_all.deb ../linux-headers-3.2.0-24-server_3.2.0-24.38_amd64.deb ../linux-image-3.2.0-24-server_3.2.0-24.38_amd64.deb ../linux-source-3.2.0_3.2.0-24.38_all.deb ../linux-tools-common_3.2.0-24.38_all.deb
Save linux-headers-*.deb
and linux-image-*.deb
packages.
Install packages
$ sudo apt-get -y purge linux-image-$(uname -r) $ sudo apt-get autoremove --purge $ sudo dpkg -i linux-headers-*.deb linux-image-*.deb
Affected Bugs
BDI flusher threads stop working
ext4 ファイルシステムの遅延アロケーションと組み合わせてこれが起きると、 vm.dirty_expire_centisecs
が発生してしまう。
(通常 30 秒)経過してもダーティーページがフラッシュされず、永遠に空ファイルのままという現象
BDI flusher が止まる理由は kernel 2.6.36 以降での「最適化」によるものらしい。問題は、その後 dirty page
が発生したイベントを取り損ねてスレッドが起動しないことにあるようだ。手動で sync(1)
を呼べば BDI flusher
が起動するのは確認した。
c.f. R.I.P. pdflush (LKML)