tjinjin's blog

自分用のメモです

サーバ/インフラを支える技術を読んだ

最近技術書からのインプットが不足している気がするので、毎週本を呼んで少しでも覚えたことをまとめておこうという試みです。全部読み切れなくても、一旦アウトプットします。

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

どんな本?

インフラの設計を全体的に学べる本です。最近の本ではないですが、基本的な考え方を押さえる意味でも読む価値はあると思います。実際の設定なども出てくるので、環境作って試しながらやるとより理解が進むかもしれません。

目次

1章 サーバ/インフラ構築入門 ……冗長化/負荷分散の基本
1.1 冗長化の基本
1.2 Webサーバを冗長化する ……DNSラウンドロビン
1.3 Webサーバを冗長化する ……IPVSでロードバランサ
1.4 ルータやロードバランサの冗長化
2章 ワンランク上のサーバ/インフラの構築 ……冗長化、負荷分散、高性能の追求
2.1 リバースプロキシの導入 ……Apacheモジュール
2.2 キャッシュサーバの導入 ……Squid、memcached
2.3 MySQLのレプリケーション ……障害から短時間で復旧する
2.4 MySQLのスレーブ+内部ロードバランサの活用例
2.5 高速で軽量なストレージサーバの選択
3章 止まらないインフラを目指すさらなる工夫 ……DNSサーバ、ストレージサーバ、ネットワーク
3.1 DNSサーバの冗長化
3.2 ストレージサーバの冗長化 ……DRBDでミラーリング
3.3 ネットワークの冗長化 ……Bondingドライバ、RSTP
3.4 VLANの導入 ……ネットワークを柔軟にする
4章 性能向上、チューニング ……Linux単一ホスト、Apache、MySQL
4.1 Linux単一ホストの負荷を見極める
4.2 Apacheのチューニング
4.3 MySQLのチューニングのツボ
5章 省力運用 ……安定したサービスへ向けて
5.1 サービスの稼働監視 ……Nagios
5.2 サーバリソースのモニタリング ……Ganglia
5.3 サーバ管理の効率化 ……Puppet
5.4 デーモンの稼働管理 ……daemontools
5.5 ネットワークブートの活用 ……PXE、initramfs
5.6 リモートメンテナンス ……メンテナンス回線、シリアルコンソール、IPMI
5.7 Webサーバのログの扱い ……syslog、syslog-ng、cron、rotatelogs
6章 あのサービスの舞台裏 ……自律的なインフラへ、ダイナミックなシステムへ
6.1 はてなのなかみ
6.2 DSASのなかみ
Appendix
mymemcheck(4.3節)
apache-status(5.2節)
ganglia.patch(5.2節)

学んだこと

keepalivedで負荷分散出来たり、DSRという技術もあったなといろいろ学びが多い本でした。あとはkeep-aliveについて。keep-aliveを使うとセッションを維持してしまって、Webサーバにコストがかかる。そこで、リバースプロキシをかませて、クライアントーリバースプロキシ間でkeep-aliveをオンにしてその後ろではオフにすることで、全体のスループットが向上できるという話など。サーバの構成を考える際に有用な本だなと思いました。一番興味深かったLinux性能の話についてまとめておきます。

Linuxの性能について

この本の中でもサーバの負荷の話が面白かったので、まとめておきます。

負荷とは?

  • CPU負荷とI/O負荷に区分される。WebサーバならCPU、DBサーバならI/Oに依存することが多い。

LAとは

  • ロードアベレージとは、左から順に1分、5分、15分の間に単位時間辺りに待ったタスクの数
load averages: 2.60 2.29 2.62
  • 上記が高い値だと負荷が高いといえる。
  • Linuxカーネルのプロセススケジューラがプロセスの実行順をスケジューリングしている。
  • CPUの状態は下記の5つに分類できる。
状態 説明 LAの集計対象
TASK_RUNNING 実行待ち状態
TASK_INTERRUPTIBLE 割り込み可能な待ち状態
TASK_UNINTERRUPTIBLE 割り込み不可な待ち状態
TASK_STOPPED 実行中断になった状態
TASK_ZOMBIE ゾンビ状態
  • 上記の中でLAの対象になるのは表の通り。CPUを使いたいけど使えない状態とディスクの入出力待ちなどの短時間で終了するような中断状態であるとき。(CPU待ちとディスクI/O待ちと言ってしまってよい)

  • ハードウェアには一定周期でCPUに割り込み信号を送っており、この割り込み毎にLAの計算をしている。その結果がuptimeコマンドなどにより表示される。

CPU使用率とI/O待ち率

  • CPUにはユーザモードとシステムモードがあり、ユーザモードは、ユーザプログラムが動作するモード、システムモードは、カーネルが動作する際のCPUモードである。CPU使用率が高いといった場合は主にユーザモードの値が高くなる。
  • sar -Pでコア毎にCPU利用率がわかる。

スレッドとプロセス

  • スレッドはプロセスよりも細かな実行単位。プロセスの中で複数のスレッドを動作させることができる。
  • プロセスを複数生成して実行コンテキストを複数確保(マルチプロセス)
  • スレッドを複数生成して実行コンテキストを複数確保(マルチスレッド)
  • 2つの違いは、マルチプロセスはメモリ空間をそれぞれ個別に持ち、一方マルチスレッドはメモリ空間を共有する。メモリ使用の効率やメモリ空間の切り替えをしない分、大量の実行コンテキストを必要とする場合は後者がよい。

性能を判断するための指標

ps プロセスが持つ情報を出力

  • %CPU:そのまんま
  • %MEM:物理メモリの消費量
  • VSZ,RSS:そのプロセスが確保している仮想メモリの容量、物理メモリの容量
  • STAT:プロセスの状態
  • TIME:CPUの使用時間

ps -u CPU使用率を見る

  • user:ユーザモードでCPUが消費した割合
  • nice:スケジューリングの優先度を変更していたプロセスがユーザモードでCPUを消費した割合
  • system:システムモードでCPUが消費された割合
  • iowait:ディスクI/O待のためにアイドル状態で消費した割合
  • steal:OSの仮想化などで他のVMにCPUを使われ待たされた割合
  • idle :アイドル状態で消費した割合(I/O待ちでない)

sar q LAを見る

sar -r メモリの利用状況を見る

  • kbmemfree:物理メモリの空き容量
  • kbmemuserd:使用中の物理メモリ量
  • memused:物理メモリ使用率
  • kbbuffers:カーネル内のバッファとして使用されている物理メモリ
  • kbcached:カーネル内でキャッシュメモリとして使用されている
  • kbswpfree:スワップ領域の空き容量
  • kbswpued:使用中のスワップ
  • kbcahcedはページキャッシュされると増えていく。ページキャッシュの有無によって、io性能は大きく変わるので注意

sar -w スワップ発生状況を見る

  • スワップが発生すると大幅に性能が劣化する

vmstat 仮想メモリの関連情報を見る

  • bi:ブロックデバイスから受け取ったブロック(ディスクのREAD)
  • bo:ブロックデバイスから送られたブロック(ディスクへのWRITE)
  • どの程度I/Oが発生したかみたいときに使う。

参考

Linux - システムの負荷の原因を切り分ける方法 - Qiita server - アプリエンジニア向け:「サーバがなんか重い」時にすること - Qiita

オライリーのセールで買ってしまいました。2年くらいで読めるかな…

詳解 Linuxカーネル 第3版

詳解 Linuxカーネル 第3版

安西先生…もっと…パフォーマンスチューニングしたいです…