大規模サイトの為のLinuxカーネルチューニング

鯖屋のお仕事ってどーよ
大規模サイトの為のLinuxカーネルチューニング
関西オープンソース 2004
ステージ
2004年10月22日 13:45 - 14:00
もりかわひろかず
はじめに
• SunOS4, Solaris2, FreeBSD系で育ってきた鯖
屋が、1999年に Linuxでの大規模サーバ(大規
模なweb、メール、共有型仮想サーバ)の運用
を試行錯誤しながら行い、肌で感じた Linux
kernel の体験記(格闘記)をお話し、それを通じ
て運用の現場の姿を感じていただけたらと思
います
遠い昔…
A long time ago in the UNIX far, far away….
• 1994年頃からインターネットサーバのSIを手がけてい
た
• その頃、Solaris 2系が安定してきて、SunOS4を捨て
てSolaris 2系に移行していた
• PC-UNIXは*BSD系しか選択肢無し
• 当時、Linux系はnetwork系の信頼性が無いという話
で、実際のサービスには使わなかった
(冒険はしたくなかった)
• 安定性があり、運用ノウハウが多いOSを選択した
枯れたOS
• 実際の業務に使用するOSの選択に際しては、
枯れたOS(信頼性があり、安定して、ノウハウ
も蓄積された)を選択するでしょう
• 大規模なサーバ運用にも枯れたチューニング
の定石があった
なぜチューニングが必要なのか
• 一般的な使用状況を想定してる
– 無駄なリソース浪費を避けるため
• 安全性を確保するためにリソース制限をしている
– open files, memory, process…etc
– 各ユーザごとのリミット
• 何につかうのか?
その用途に合わせてチューニングする必要がある
– リソースを消費してもスピード優先という用途
– DBのような巨大アプリを動かすという用途
– たくさんのユーザを安全にさばくという用途
定石
• Solaris系では
– /etc/system の maxusers, rlim_fd_max, rlim_fd_cur
• maxusersを変更することによってkernel内のテーブルサイズを自動
的に調整する
– (BSD系であるSunOS4から引き継いだ)
– あとはnddでdriverのconfigurationをさわる
• 挙動を見てNetwork系のパラメータを変更
– 大規模なDBサーバやroot DNSにも実績がある
– 世の中に書籍やよくまとまったtuning 系の tips Web Siteが
あった
定石 (2)
• FreeBSDでは
– Kernel configuration の maxusers, NMBCLUSTERS をさわ
る
• 今は maxusers=0 にしておけばハードのスペックを見てよしなに設
定してくれる
kernel recompile すら不要で
/boot/loader.confにホゲっておわり
– FD_SETSIZE, SOMAXCONN系の調整
• sysctl と アプリ側の調整
• 学術分野での長年のノウハウ蓄積
• 過 負 荷 で 悲 鳴 を あ げ て も 予 測 の 範 囲
(調整の範囲)
Linux を使え!
• 1999年 Linuxバブル全盛期
• 営業サイドから Linux を使えとのご命令
– お客様はLinuxを望んでおられる
(お客様は神様です)
– お客様のニーズに早く対応すべき
• Linux 2.2.11-ac? ぐらいから安定してきたという噂が
あった
• ちょいとLinuxさわってみるのもいいかな
• まー UNIX(like)だしなんとかなるかー
おどろいた!
• おそろしく速い filesystem
– 恐れていた障害時の不整合は皆無
• 意外と丈夫じゃん
• I/Oが早いのは大規模なWebサーバにとっては
うれしい
• さっと動かしたら安定してるじゃん
• 結構 Linux ラヴ☆かもぉ
限界まで鯖をシバク
Size matters not.
• こんな鯖
– ps ax | wc -l
1115
– cat /proc/net/sockstat
Sockets: used 643
TCP: inuse 637 orphan 45 tw 71368 alloc 641
mem 796
• Apache combined format の access log が 1
日で6GB以上
定石(3)
• 2.4.x Linux では
– システム中のファイル・ディスクリプタ数の上限を緩和する
• echo "32768" > /proc/sys/fs/file-max
– ユーザ毎のファイル・ディスクリプタ数の上限を緩和する
• ulimit -n unlimited
– ユーザ毎の起動するプロセス数の上限を緩和する
• ulimit -u unlimited
– セマフォの設定の上限を緩和する
• echo "250 32000 128 1024" > /proc/sys/kernel/sem
– ネットワークキューの上限を緩和する
• echo ”2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog
不可解な挙動
Linuxの心が解るまでの道のり
•
•
•
•
•
•
•
•
定石の調整はやっていたが…
ふつーにつかってるかぎりはすごく安定していた
むちゃな使い方したらMM系で不可解な挙動
メモリーは余裕があるのに突然のOOM-kill
ドライバからはバッファが足りないとの悲鳴
なぜ急にメモリーが足りなくなるのぉ
なぜ極端にパフォーマンスが悪くなるのぉ
2.2の途中までは過負荷時に突然死も
– ぐはっ吐血!
Linuxの心が解るまでの道のり(2)
• 当時は、Linuxを用いた大規模サーバの運用ノウハウの情
報が不足
• Linux関連書籍は多いが入門書(インスコ本)ばっか
• おしえてGoogle!
– しかし、当時はまとまった情報は無し
• できるヤツはそんなの当たり前でわざわざとりたてては書
かない!?
• kernelあげろ、メモリー増やせ攻撃
– 本質の議論無し
不可解な挙動の例
No! Try not. Do, or do not. There is no try.
• パフォーマンスがよかったので採用したIntel
EtherExpress Pro/100 で当時 2.2 のドライバ
eepro100 が過負荷時に
eth0: can’t fill rx buffer
のメッセージをはきまくる
• (その当時は Linux でそのNICを使うことを嫌う
人もたくさんいた)
不可解な挙動の例(2)
• Googleで検索したら、同じように困ってる人ちらほら
• ズバリの解決策は見付けられなかった
– ふつーに使ってる限り出ないもん
• お決まりの監視
–
–
–
–
vmstat 1
watch -n 1 ’cat /proc/meminfo’
watch -n 1 ’cat /proc/slabinfo’
watch -n 1 free
不可解な挙動の例(3)
• どうも、そのメッセージを吐く時は MemFree が極端に少なく
なっているっぽい
• しかし、Buffres, Cached はふんだんに確保されている
• そのあたりに秘密がありそう
• /proc/sys/vm あたりで tuneable な物を探すとbdflushと
freepages(2.2の場合) が怪しい
不可解な挙動の例(4)
• /usr/src/linux/Documentation を読む
– ここでもカルチャーショック受る
• メンテされてない(^^;;;
• man も嘘書いてる場合もあるし…
• /proc/sys/vm/freepages を増やしてやると現象はおさまるよ
うだ
• freepages をキーワードにざっと kernel の source を追っかけ
てみた
– なんか謎な閾値やら定数やら…
• Memory Management subsystem 怪しいなぁ
Linuxの心が解るまでの道のり(3)
Use the source, luke!
• 「KISS principle」”Keep it Simple, Stupid”, “Keep it
Simple and Small”には共感するが…
• コア開発者が議論している kernel mlやMM ml をあさ
る
• MMごっそりかえちゃえ的なノリ
• AndreaさんとRikさんが喧嘩してるしぃ
• 仕切りまくる Alan Cox 氏
• 慎重な Linus 氏
Linuxの心が解るまでの道のり(4)
No! No different! Only different in your mind.
• 猥雑だけどパワフル
• *BSD系にはない面白さ
(猥雑さが嫌いという意見もよく解るけどね)
• 自分が同時代的に参加しているのだという気になる
し、参加せざるを得ない面白い開発コミュニティー
• というわけで自分も何かしようと1999年から kernel
tuning 系 tips を Web siteで書き始めた
(今ではいろんな所にいっぱい情報が出てます)
枯れないOS
とーれとれぴーちぴちLinux
• “枯れ”とは無縁
• 日々改善、日々実験
– ハードウェアやnetwork環境はものすごく変化している
– それにつれて kernel も変化している
• 現実のサービスに使っていいかどうかは議論がある
が(安定性、信頼性の面で)
• 処理が速いのは得難いメリット
• “今”はかなりいいよね
– いつも”今”が旬
おまけ
• 最近のディストリビューションのkernelなら安定してま
す
• 特にサーバ用として提供されている物であれば変更
を加えることも不要 (のはず)
• 自身でkernelをcompile場合は、-ac, -aa, -mm 等の
patchを吟味した上で、必要に応じた物を当てたほう
がいいです
• 素のリリースのままでは不具合がでるパターンもある
• 2.4.x では -rmap は有効かも
• そろそろ 2.6.x にかえる時期かも
May the source be with you!
•
•
•
•
•
•
•
http://www.kernel.org/pub/linux/kernel/people/alan/
(-ac patch) 旅に出ますた!
http://www.kernel.org/pub/linux/kernel/people/andrea/
(-aa patch)
http://www.kernel.org/pub/linux/kernel/people/akpm/
(-mm patch)
http://linux-mm.org/ the home page of Linux-MM
http://surriel.com/patches/ Rik van Riel's Linux kernel patches
(-rmap VM patch)
http://www-didc.lbl.gov/TCP-tuning/ TCP Tuning Guide
http://www.nxhack.tarumi.kobe.jp/linux_kernel_tuning.html
私のWeb