midnight in a perfect world

webエンジニアのメモ

 「ボトルネックがすぐわかる、現場のためのwebサーバ高速化教本」を読む。

ボトルネックがすぐわかる、現場のためのWebサーバ高速化教法
 

 今年出たばっかりで情報の鮮度が高そうだし、SRE的なノウハウが学べそうだなと思って読んでみたけど、期待外れ。結構豪華な装丁の割りに内容薄いし、誤字脱字が多かったり、副詞や助詞がどの単語にかかってるか分かり辛かったりと本としてのレベルが低い。別に設計書ライクな無味乾燥な書き方が良いわけではないけど、単純に伝わり辛いなと読んでて思った。また、Linuxディストリビューションとか無意味な一覧が多い。表にまとめてそれぞれの特徴を整理するため、みたいな使い方なら分かるけど、単純に言葉の羅列になっていたり、「何を説明するためにこれを書いたのか?」が分かり辛く、悪い言い方をすると「技術書を出したいから内容如何よりページを埋めるために書いてみた」的な感じ取れなくもない内容。書かれてる内容が誤っているみたいなレベルの悪書ではないけど、なかなか活用しづらい本になってしまっていると思う。

まぁそれでもLAMP構成のwebサーバを高速化するためにどうやって計測するかという観点で色んなベンチマークを紹介していたり、色んな切り口で作者が生のシステムで試してみた比較結果を載せているので、そういう点では参考になる。ただ、特にPHPやSQLの高速化という観点では、今まで自分が学んできたオブジェクト思考の考え方やプログラミングの書き方という点で高速化するために非常に大きな犠牲を払うやり方を推奨していて、ホントにそれでいいのか?と思ってしまう部分も多かった。例えば、「go to文はバグの温床となるから使うな」とか「if文のネストはなるべく深くするな」というのはかなり一般的な設計だと思うが、本書では(場合によってだけど)それを推奨していたりとちょっと怖い内容になっている。

一応学びになった点のメモ。

  • JavaScriptは基本的にHTMLレンダリングが完了した後に実行されるプログラムのため、(JavaScriptのリンクを)最後に配置することで、JavaScriptがHTMLレンダリング中にダウンロードされることによる表示の遅延を回避することが出来る。
  • 画像データを扱うときは、色数が多い写真やイラストはJPEGで保存する。グラフや単一色の図などはPNGを選ぶべし。圧縮率が大分変わるので、容量を節約できる。また、EXIFデータというGPS情報等のメタデータについても不要であれば削除すると容量を削減できるしセキュリティの向上も図れる。
  • スペースと改行コードを取り除くと容量削減できる。JavaScriptのminファイルという奴がそうで、1/3ほどに出来る。でも、当然ながらめっちゃ読みにくくなる。
  • ApacheやnginxはWebサーバ上のテキストファイルを圧縮してクライアントに送信する機能がついているので活用すべし。圧縮・解凍の負荷の方がネットワークトラフィックよりはるかに小さいので気にせずやるべし。
  • Webサーバ上に公開するファイルには有効期限をつけるべし。有効期限内であれば2回目以降のダウンロードは行われず、トラフィックの軽減につなげられる。
  • HTTP/1.1からHTTP/2に挙げるべし。SSL/TLSでセッション数を確認した後、複数のリクエストを並列で処理することが出来る。優先度フレームの設定やHPACK(ヘッダ情報の圧縮)を使うことでさらに高速化が可能。また、ドメインシャーディングすることでリクエストを分散化して高速化も可能。HTTP/2以降はQUICプロトコルが注目されている。
  • PHPはプログラムを一行も変えずに、アクセラレータのコードキャッシュ機能を導入することで高速化が可能。一度プログラムをコンパイルして生成したObjectを破棄せずにメモリにキャッシュとして持たせるという機能。
  • PHPからRDBへの接続方法を変えることで高速化出来る。MySQL以外使わない場合はmysqliで良いが、今後変える可能性がある場合はPDOを使うと良い。
  • データキャッシュ機能をPHPのプログラム中に記述することも有効だが、データが流動的で毎回取得する値が変動するような場合に使用すると前の状態の値を表示してしまうというバグが発生するので、不変データのみに限って利用する。
  • SQLはWHERE句で照合をかけるとき、INをEXISTSに変えるだけで展開されるデータ量が大幅に削減されるため、処理が早くなる。
  • nginxは、Apacheと比べて高い並列処理が可能。軽い、早い、安定する、設定が簡単という理由でめちゃ利用が増えている。
  • WebとPHPの接続APIにはphp-fpmを利用すると処理の引き渡しがシンプルで早くなる。
  • トリビアとして。AWSは元々Amazonの自社ECサイトのサーバ増強や構築を簡略化するために作られたもので、改善していくうちに一般ユーザに開放しても耐え得るシステムと判断されて売り出された。