weblog of key_amb

主にIT関連の技術メモ

Shibuya Perl Mongers テクニカルトーク #17 に参加して #shibuyapm

6/2 に開催された Shibuya Perl Mongers テクニカルトーク #17 に参加してきました。

自分は初参加だったのですが、なんと前回開催から4年ぶりの開催とのこと。
「もうみんな Perl なんて書いてませんよね」というアイロニーな雰囲気が漂いつつも、「やっぱり Perl 書いてる」という人もたぶん 40% 以上ぐらいはいて、LT の盛り上がり具合から見てもみんな Perl が好きなんだなと感じるひとときでした。

以下、セッションの内容になります。

一部資料はネットにアップされているようです。 観測範囲で捕捉したものは、順次本記事にも追加していきます。

例によって愚直にメモを取っていたら、かなりの分量になってしまったのですが、あまり削ったりせずに、ほぼそのまま上げておきます。

開会の挨拶

@takesako さん

nginxのパフォーマンスチューニング

@cubicdaiya さん

  • 自己紹介
    • Author of nginx-build, ngx_small_light, ngx_dynamic_upstream
    • WEB+DB PRESS vol.72 - nginx 特集
    • mozaic.fm #18 出演
  • Agenda
  • nginx.conf
    • デフォルトだと保守的な設定が多い
    • ディレクティブたくさんある
      • core だけで70個以上
  • core functionality
    • worker_processes - ワーカプロセス数
    • worker_connections - ワーカごとのコネクション数
    • worker_rlimit_nofile - OS依存だったり
  • worker_processes
    • cpu コア数目安に
      • auto にしておけばコア数になる
    • 接続数に応じて大きくする
    • CPUバウンドになりそうならさらに大きめにする
  • worker_connections
    • 通常は1024 - 8192
      • 万単位でもいけそうだけどやったことない
      • worker_processes とセットで考える
    • ※プロキシ先の接続数も含まれる点に注意
  • worker_rlimit_nofile
    • fd の最大数
    • 65535
  • sendfile
  • keepalive_timeout
    • クライアントとの keep-alive 通信
  • open_file_cache
    • 一度開いたファイル情報をキャッシュ
      • ファイルのfd, サイズ、更新日時
    • `open_file_cache max=100 inactive=20s;``
  • tcp_nodelay
  • tcp_nopush
    • TCP_NOPUSH オプションの有効化
      • Linux だと TCP_CORK オプション
      • tcp_nodelay と逆の動き
  • TCP_NODELAY, TCP_NOPUSH
    • 本来、相反する動き
    • NODELAY - パケットをできるだけ即座に送信する
    • NOPUSH - できるだけまとめて送信
    • 全部有効にすると一番効率がいい
  • パフォーマンスに影響する listen パラメータ
    • spdy - SPDY
    • backlog=N - listen backlog
      • net.core.somaxconn 等も忘れずに
    • fastopen=N - TCP Fast Open
  • nginx と h2o のベンチマーク
    • c4.8xlarge on EC2
    • h2o-1.2.1-alpha1
    • nginx-1.8.0
  • h2o.conf (最適化前)
  • h2o.conf (最適化後)
    • num-threads: 16
    • max-connection - 10240
  • nginx.conf (最適化前)
    • worker_processes: 1
  • nginx.conf (最適化後)
  • 結果
    • 最適化前だと h2o が圧倒的
    • 最適化すると Nginx がちょっと速い
  • nginx と gzip 圧縮
    • gzip - gzip 有効化
    • gzip 設定例
    • 静的コンテンツの gzip 圧縮は積極的にすべき
    • CPUリソース消費が無視できない場合
      • gzip_static で gzip 圧縮済みファイルを配信
    • gzip_static 設定例
location ~ ... {
    gzip_static always;
    gzip on;
}
  • zopfli で更に圧縮
  • nginx とバッファリング
    • バッファリングの On/Off
      • proxy_buffering (default: on)
        • ストリーミング相当の処理をする際は off にするか要検討
      • proxy_request_buffering (default: off)
        • 大きなファイルのアップロードがあるときに on にするか?
    • バッファリングと I/O
      • nginx の各バッファのサイズは比較的小さめ
        • だいたい数KB
      • バッファが足りなくなるとディスクに書き出す
      • tmpfs 使う
    • バッファリングと tmpfs
      • 書き出し先を選ぶディレクティブがある
    • HTTPS 関連のチューニング
      • TLS Session Cache
        • TLS ハンドシェイクのセッションをサーバにキャッシュ
        • 複数台でセッション共有はできない
      • TLS Session Tickets
        • 暗号化したセッション(チケット)をクライアントに渡す
        • 対応してない機種も多い
      • OCSP Stapling
        • OCSP による SSL 証明書の失効確認をサーバ側で行ってキャッシュ
        • クライアント側でやると TLS ハンドシェイク時にレイテンシ発生
        • ssl_stapling, ...
      • SPDY
        • listen 443 ssl spdy;
      • Optimizing the TLS-record size
        • TLS では一定サイズ毎に通信内容を暗号化する
          • ssl_buffer_size (default: 16k)
        • 16KB だと大きすぎて新規TCP接続時のRTTが増加
          • 一般的なWebサイトなら小さいほうがいい
        • TTFB改善に効果あり
  • まとめ
    • Nginx はパフォーマンスに影響するディレクティブがたくさんある
    • デフォルト設定は割と保守的

H2Oのパフォーマンスか機能に関する未発表の何か(仮)

@kazuho さん

  • How h2o started
    • 2014末ごろ公開
    • HTTP/1, 2 サポート
    • 高パフォーマンス
  • Benchmark
    • Nginx との比較
  • PicoHTTPParser
    • Plack の中で使われている HTTP Parser
    • node で書かれたものの 5倍ぐらい速い
  • h2o 設計哲学
    • 良い設計で一からコードを書く
    • picohttpparser - code 量小さい
    • 良い設計で良いパフォーマンスを出す
  • h2o 設計
    • イベント・ドリブン
    • マルチスレッド
      • Nginx はマルチプロセス(?)
    • multi-protocol
      • 最初から HTTP/2 , TLS サポート
  • h2o の目的
    • 速いこと
      • IoT, microservice, ...
    • ユーザ体験の向上
    • 使いやすい, 設定が楽
      • chacha20/poly1305 - Chrome の暗号化スイート
        • OpenSSL には入ってないけど
      • 動的に設定変更可能
  • 主な機能
    • HTTP/2
    • HTTPS 設定
      • OCSP stapling, ...
      • libressl bundle
    • Server::Starter 内蔵 => graceful restart
    • Reverse Proxy
      • PicoHTTPParser => 高パフォーマンス
      • X-Reproxy-URL ... ファイル転送
      • DNS lookup を内部でやってる ★キャッシュは?
  • h2o を使うことで UX 向上するのか
    • HTTP/1 の問題 <= HTTP/2 で修正された
      • head-of-line blocking
        • 1個前のリクエストが詰まってると次のリクエストが処理できない
        • せいぜい6並列ぐらいしか動かせない
      • リソース取得の優先度付け
        • CSS, JS とか先に取得したい
    • HTTP/2 の優先度付け
      • 重みベース
      • 依存性ベース
      • Firefox は上手く実装してる
      • Chrome は重みベースのみ 
    • ベンチマーク取ってみた
      • 環境
        • HEAD の中に css x 5, JS x 8
        • 18 個のアセットファイル
        • network - 4G 相当
      • Nginx (HTTP/1.1) + Chrome
        • 1.8 sec
      • Nginx (SPDY/3.1) + Chrome
        • 1.8 sec ちょい
      • h2o (HTTP/2) + Chrome
        • 1.8 sec ちょい
      • Why ?
        • Chrome の優先度付けの制限による
      • h2o (HTTP/2 + repriotize:ON) + Chrome
      • Nginx (HTTP/1.1) + Firefox
      • Nginx (SPDY/3.1) + Firefox
        • 1.9 sec 遅くなった
      • h2o (HTTP/2) + Firefox
        • 1 sec 未満 ★★ <= Firefox の優先度付けが賢いので
    • ベンチマークまとめ
      • h2o で速くなる
  • 結論
  • 今後
    • v1.3 - 今週?
      • 今日紹介した http2-repriotize-blocking-assets
      • FastCGI サポート
  • Q&A
    • h2o 以外の HTTP/2 サーバ実装
      • nghttp2 - サーバ/クライアント両方使える
    • 日本はどうなのか
      • http2study
      • 海外の技術者も日本の人にお世話になってる
    • Debug どうするの?

LT

スライド(発表資料)

https://speakerdeck.com/shoichikaji/debug-perl

ppencode 2 - ppencode @shinh

聴講メモ

  • ドキッ!記号だらけの無名関数 - @tsurumau
    • lambda を定義、呼びだそう
    • 準備
      • カッコのみ
        • [], (), {} ... OK
        • 組み合わせると NG
      • ()[()] ... OK
    • リストをリストコンテキスト以外で評価したときのアレ
("foo")[()] # ""
scalar(("foo")[()]) # foo
(sub{"foo"})[()] # foo
(sub{"foo"})[()]->(1) # runtime error
  • perl 楽しい
  • %1 => sub { $_[0] }(仮) - @tokuhirom
    • タイトル変えた - Server::Starter meets Java
    • Server::Starter
      • server を起動するサーバ
      • graceful restart できる
      • 無停止で hot deploy
    • Java では?
      • 無理そう・・・?
      • System.inherit...
        • inedtd support のため
    • Server::Starter が socket を 0番で渡してくれればいい
    • --port=8080=0
      • port:8080, fd:0
    • できた!
      • Java の ver-up 安全にできる
      • ClassLoader 使うとリークするけど、これならそういう問題ない
    • OS X だと動かない
      • inetd が有効でない
    • DEMO
  • Perlコマンドラインサーバを書いてCPANモジュールに同梱する - @songmu
    • コマンドラインサーバ好き
    • CPAN に上げたやつ
      • Riji
      • APNS::Agent
      • App::LLEvalBot
      • Plack::App::Directory::Markdown
      • Ukigumo::Server
      • Gearman::Starter
    • やりかた
      • script/ に置くだけ
      • Plack のおかげで単機能HTTPサーバを書くのが楽
      • apns-agent の場合
        • 引数解析を行って Plack::Runner に投げる
    • DEMO
  • 🍣現状確認会用ネタ - @tomita
  • Inner World of Perl::Lint - @moznion
    • Perl::Lint の中身解説
      • Perl::Critic の速いやつ
    • 前処理 => 字句解析 => 解析
    • ## no lint
    • Complier::Lexer
    • XS 版
      • 速い
    • Perl 5.22 まだ対応してない
    • Policy を書くことができる
      • Policy に違反したら検出
      • 各ポリシーは独立してるので書きやすい
    • 正規表現の中身も見たい
    • 現状
      • ほぼすべての Perl::Critic 互換
    • TPF から $800 もらった
  • APIクライアントを作ろう! @__papix__
    • APIクライアント
    • Reactio
    • 名前空間
    • 依存ライブラリ
    • テスト
      • 実際のAPIを叩く => NG
      • 異常ケースのテストを書く
      • Mock 使う
    • ドキュメント
      • SYNOPSIS 書く
      • eg/ にサンプル置く
    • APIクライアント作ろう
  • Test::WWW::Stub のご紹介 @ast_j
    • LWP で HTTPリクエストするモジュールのテストを簡単に
    • 外部Webサービスのテスト
    • 外部アクセスのブロック
    • かんたんに使える
    • 類似モジュールたくさん
    • LWP::Protocol::PSGI
      • LWP のリクエストを全部受ける
    • 元々はてなで使ってた
      • 便利なので社外でも使いたい
    • Loadmap
      • 使いやすくて便利
      • 本体はコンパクトに
    • 社内発掘品
      • 他にも便利なものがある
  • Gazelle & CPAN modules for performance. @kazeburo
    • Gazelle
      • About
        • PlackHandler
        • Starlet の 3倍以上速い
      • なぜ速い
        • Simple
          • Prefork
          • No keepalive support
        • Mostly XS
      • 使いドコロ
      • 実績
        • livedoorBlog
        • Starlet から移行して CPU 1-3%下がった
    • WWW::Form::UrlEncoded(, *::XS)
    • Cookie::Baker, Cookie::Baker::XS
      • build, parse
      • cookie が長いと使える
      • 使いドコロ
        • Plack@1.0035-TRIAL で使われている
        • C::B::XS
          • Cookieがすごくたくさん付いてくるサイト
  • Perl で debug してわかったこと @ks0608
    • バグ
      • Paralle::Prefork
      • timeout つけてた
      • worker が固まる
    • gdb で backtrace
      • Sys::SigAction (POSIX::sigaction) 使ってた
        • => unsafe
      • perlipc
        • safe signal ... Cレベルの関数に割って入れない
        • unsafe signal ... 安全でない
    • まとめ
  • ドキュメントの生成とか @toku_bass
    • 背景
      • ドキュメント書かざるを得ない状況になった
      • 受託開発 
      • アプリ化に伴う分業化
    • DB spec 生成
    • API endpoint 一覧
      • router が持ってるパス使う
    • API spec 生成
      • テスト結果からの生成が楽
    • autodoc
      • 本家autodocにしかない機能がある 
      • 境界値、異常値などの情報も入れると読みづらくなる
    • バリデータ
    • API Blueprint を使わないといけなくなった
      • 独自記法がつらい
      • モジュール書くしかないか(?)
  • one source code で「複数のサービスに対応するが schema 構成は微妙にに違います」という要件に直面したら開発はどうすればいいのか、僕なりに何日か考えた上でのややベターな結論のようなもの @Yappo さん
    • 銅鑼投票
    • 既に開発運用されているコードがある
      • それを展開したい
    • 実行されるコードの差異
      • #ifdef 相当の処理 - 環境によってロジックを分離
      • グローバル変数で分岐 => よくない
      • method 化する => 要注意
      • 別の名前空間にメソッド作るぐらいでちょうどいい
    • DBスキーマ
      • Teng
      • ハックする
      • 時間がないので概要だけ
  • ppencode2 @shinh
    • ppencode 2 - ppencode2 デモサイト
    • 昔 ppencode というのがあった
    • 予約後だけで任意コード実行したい
      • できそうで意外と難しい
      • 10年が経った
    • Yuine
      • Quine の亜種みたいな

関連リンク