LinuxのKernelを再構築してCS1.6鯖で1000FPS

Kernelの2.6.30が出たので再構築ついでに、CSのサーバのFPS値について見直しました。
結果、せれろん420を使っているうちの糞鯖も1000FPSが出るようになりました。


以下参考にならないKernel再構築メモと、CSの設定について。


Kernel再構築

現在のバージョンを確認

uname -r
2.6.29


最新版のダウンロードと解凍。
本家では遅いので、日本のミラーサイトからダウンロードしてくる。
解凍時、tar.gzだとなぜか「予期せぬEOFが〜」とかいうエラーを吐いて中断を食らうので、
tar.bz2形式でダウンロード。解凍コマンドもそれにあわせる。

wget http://www.jp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.bz2
tar jxvf linux-2.6.30.tar.bz2
cd linux-2.6.30


設定ファイルの持ち越し。
以前の設定ファイルがある場合は、それを引用することで設定の手間が少し省ける。

cp 〜/.config .config


設定をする。以下のようにすると、GUIっぽい設定画面がでる。
リモート接続の環境によっては正しく見られないらしいので、
リモート操作ではなく直接繋げてみたりする。

make menuconfig


http://wiki.fragaholics.de/index.php/EN:Linux_Kernel_Optimization#Configuring_and_building_the_Kernel
を参考に、設定を行う。
僕の行った主な設定は以下のとおり。

  • Processor type and features:
    • Tickless System (Dynamic Ticks)を無効
    • High Resolution Timer Supportを有効
    • Processor family をメーカーと型番、コードネームなどに注意して選択。
    • Preemption Modelで「No Forced Preemption (Server)」を選択
    • Machine Check Exceptionを有効
    • Timer frequency で 1000Hz を指定
  • Power management options
    • Power Management supportを有効
    • Power Management Debug Supportを無効
    • Suspend to RAM and standbyを無効
    • Hibernation (aka 'suspend to disk')を無効
    • ACPI (Advanced Configuration and Power Interface) Supportを有効
    • CPU Frequency scaling の CPU Frequency scalingを無効
  • Networking support
    • Networking options
      • Packet socket: mmapped IOを有効
      • ファイアーウォールを使わない場合は、Network packet filtering frameworkを無効。
      • QoS and/or fair queueingを無効
  • Device Drivers
    • Watchdog Timer Supportを無効
    • Real Time ClockとPC-style 'CMOS'を有効
  • Kernel hackingの項目を全て無効にする


不要なデバイスドライバ(Bluetooth, 無線など)混ざっていたりするので、
使うことがないのなら切るとKernelの軽量化に繋がる。


また、もし、iptableを使う場合は、Networking support設定が必要なので注意。
以下を参考に設定をする。
http://www.freewheelburning.com/linux/iptables2.html


その後、param.hの編集を行うのだが、非常に数が多い。
findコマンドで探すとよくわかる。

[root@localhost linux-2.6.30]# find ./ -name 'param.h'
./arch/mn10300/include/asm/param.h
arch/s390/include/asm/param.h
arch/xtensa/include/asm/param.h
arch/sparc/include/asm/param.h
arch/um/include/asm/param.h
arch/alpha/include/asm/param.h
arch/cris/include/asm/param.h
arch/m68k/include/asm/param.h
arch/avr32/include/asm/param.h
arch/arm/mach-netx/include/mach/param.h
arch/arm/include/asm/param.h
arch/arm/plat-omap/include/mach/param.h
arch/arm/mach-pnx4008/include/mach/param.h
arch/m32r/include/asm/param.h
arch/blackfin/include/asm/param.h
arch/x86/include/asm/param.h
arch/frv/include/asm/param.h
arch/powerpc/include/asm/param.h
arch/h8300/include/asm/param.h
arch/ia64/include/asm/param.h
arch/parisc/include/asm/param.h
arch/mips/include/asm/param.h
arch/microblaze/include/asm/param.h
arch/sh/include/asm/param.h
drivers/char/rio/param.h
include/linux/param.h


上のファイルの中から、環境にあっているものを開き、以下のように編集。

 -# define USER_HZ         100
 +# define USER_HZ         1000

環境にあっているものがわからなかったら、全て開いて置き換えると間違いがない。
でも文字列の置換がめんどくさい!という場合は、
以下のコマンドで自動的に上記の置換をしてくれるはず。自己責任で。

find ./ -name 'param.h' -print0 | xargs -0 perl -pe 's/USER_HZ\s+100\s+/USER_HZ\t1000\t/g


設定が終わったら、makeする。
僕の環境では以下のエラーが出た。

  CC      init/version.o
  LD      init/built-in.o
  LD      .tmp_vmlinux1
ld: unrecognized option '--build-id'
ld: use the --help option for usage information
make: *** [.tmp_vmlinux1] エラー 1

どうやら、「ldコマンドに--build-idオプションはないよ」っていうことらしい。
心当たりがあるとしたら、どうしても4.3.3のGCCコンパイル導入できなくて、
得体の知れないGCCバイナリをどこからか拾ってきて、上書き導入したこと。
この時にldコマンドも一緒に上書きされて、調子が悪くなったんじゃないか、と推測。


解決のためには、gnu ldを導入しなおせばいいはずなのだが、コレを入れるには、
GCCを拾ってきて、makefile作成時に--with-gnu-ldってオプションをつけなければならない。
でもGCCコンパイルがうまくいかないわけで・・・困ったちゃん。
もしかしたらfindコマンドで得体の知れないldコマンドがあるかもしれない、と探してみると、
見事にヒットしたので、/usr/bin/ldにこのldのシンボリックリンクを張ってみた。


気を取り直し、makeをする。非常に長い。
makeを実行したら、風呂入ったり、布団に入って寝たほうがいい。僕は寝た。

make


コンパイルしたもののインストール

make bzImage
make modules
make modules_install
make install


/etc/grub.conf が書き換えられ、新しいKernelではなく古いKernelを使って起動する設定になっているので、
先ほど入れたKernelを使うように、 /etc/grub.conf を編集。

 -default=1
 +default=0


再起動

shutdown -r now


再起動後、バージョンを確認。

uname -r
 2.6.30


お疲れ様でした。

CS鯖

サーバのsys_ticrateを1000→1200に変更。それだけ。


今までの1000だと、なぜか500〜800ぐらいしか出ないので、
思い切って1200にしてみたら、1000FPSが出るようになった。


ただ、POD-BOTを5体入れると、不安定になる。
どうみてもスペック不足

] rcon stats 
CPU   In    Out   Uptime  Users   FPS    Players
99.90  5.61  7.51     695    12 1000.00       1

] rcon stats 
CPU   In    Out   Uptime  Users   FPS    Players
99.90  5.36  7.04     695    12  969.93       1

] rcon stats 
CPU   In    Out   Uptime  Users   FPS    Players
99.90  5.32  6.89     695    12  624.61       1


CPU使用率は、
rcon stats読みで99.90だが、topコマンド読みでは30%前後。
結構差があるんだね。なんでだろうか。
CSの鯖はstatsで見るほどCPUを食ってないのか、topコマンドがおかしいだけなのか。