Hash Table Sizeの変更

2013年の話題としては今更感がありますが、LVSのHash Table Sizeを変更するために、EC2上のCentOS 6.3でカーネルを再構築したのでメモしておきます。


ちなみにAmazon Linux AMIだとカーネルのバージョンが新しいので、/etc/modprobe.d/ipvs.conf とかに

options ipvs conn_tab_bits=20

とか書いておくと、再起動時に変更できます。

下準備

CentOSの公式AMIからEphemeral Disk、またはEBS付きでインスタンスを起動します。
https://aws.amazon.com/marketplace/pp/B00A6L6F9I

起動したらログインしてディスクをマウント。

mkdir /mnt/vol
#mkfs.ext4 /dev/xvdf
mount /dev/xvdf /mnt/vol

ビルド・rpmの作成

# カーネルのバージョンは 2.6.32-279

# 必要なパッケージのインストール
yum install -y asciidoc binutils-devel bison elfutils-libelf-devel gcc hmaccalc kernel-devel make newt-devel patchutils perl-ExtUtils-Embed python-devel redhat-rpm-config rpm-build xmlto zlib-devel

# rpmbuildの設定
mkdir /mnt/vol/rpmbuild
ln -s /mnt/vol/rpmbuild ~/rpmbuild
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

# srpmをインストール
rpm -ihv http://vault.centos.org/6.3/os/Source/SPackages/kernel-2.6.32-279.el6.src.rpm

# ソースコードの展開
cd ~/rpmbuild/SPECS
rpmbuild -bp --target $(uname -m) kernel.spec
cd ~/rpmbuild/BUILD/kernel-2.6.32-279.el6/linux-2.6.32-279.el6.x86_64

# EXTRAVERSIONを設定
sed -i -r 's|^EXTRAVERSION =.*|EXTRAVERSION = -279.el6.x86_64.lvs|' Makefile

# 念のため…
make clean && make mrproper

# CONFIG_IP_VS_TAB_BITSを変更
cp /boot/config-2.6.32-279.el6.x86_64 .config
sed -i -r 's|^CONFIG_IP_VS_TAB_BITS=.*|CONFIG_IP_VS_TAB_BITS=20|' .config
make oldconfig

# rpmの作成
make rpm

rpmの作成完了まで c1.xlargeで26分、m3.2xlargeで23分ほどかかりました。

インストール

# カーネルのインストール
rpm -ihv kernel-2.6.32279.el6.x86_64.lvs-1.x86_64.rpm

# initrdの作成
mkinitrd /boot/initramfs-2.6.32-279.el6.x86_64.lvs.img 2.6.32-279.el6.x86_64.lvs

/boot/grub/grub.confを以下のように修正します。

default=0
timeout=1

title CentOS (2.6.32-279.el6.x86_64.lvs)
        root (hd0)
        kernel /boot/vmlinuz-2.6.32-279.el6.x86_64.lvs root=/dev/xvde ro
        initrd /boot/initramfs-2.6.32-279.el6.x86_64.lvs.img

title CentOS-6.3-x86_64-GA-03 2.6.32-279.el6.x86_64
        root (hd0)
        kernel /boot/vmlinuz-2.6.32-279.el6.x86_64 root=/dev/xvde ro
        initrd /boot/initramfs-2.6.32-279.el6.x86_64.img

その後、再起動。

動作確認


[root@ip-10-0-198-140 ~]# uname -r
2.6.32-279.el6.x86_64.lvs
[root@ip-10-0-198-140 ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=1048576)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn


一応、ビルドしたrpmはアップしておきます。
CentOS 6.3の公式AMIでは使えると思います。
https://docs.google.com/file/d/0B7Ozt7qNZ1flS2JQUlFDWEN4SEU/edit