entry-header-eye-catch.html
entry-title-container.html

entry-header-author-info.html
Article by

Bigtableの読み取り速度をGoとPHPで比較してみました

こんにちは、インフラ部でアルバイトをしているmya0です。

Cloud Bigtableをpixivのサービス内から利用したときの読み取り速度にどの程度影響があるのか調べるために、Go, PHP(cli), nginx+php-fpm, apache+mod_phpで測定し比較しました。

Bigtableとは

Google Cloud PlatformのCloud Bigtable(https://cloud.google.com/bigtable?hl=ja)は、大規模なデータを低レイテンシで扱うことのできるNoSQLデータベースサービスです。

SSDの1ノードで10,000行/sの処理ができ、オートスケールにも対応しています。

pixivでは、広告システムなどで利用されていますが詳細についてはこちらの記事を参照してください。

今回の調査では、MySQLに入れるにはシャーディングなどを行う必要性がある規模のデータを入れたいといった要望があり、そのための選択肢の一つとしてBigtableのパフォーマンスの測定などをしました。

測定方法

クライアントはGCEのasia-northeast1-cにe2-mediumを作り、
BigtableはSSDの1ノードをasia-northeast1-cで起動し、10,000件のデータを保存しています。
50回ランダムに1行取得し、そのレイテンシを測定しました。
別で行った測定で1ノードあたり5,000行/sまではレイテンシに差が出ないことが分かっているので回数は少なくしています。

検証に使用したコードは以下になります。

gist.github.com

GoとPHP(cli)ではドキュメント(https://cloud.google.com/bigtable/docs/performance?hl=ja)の記載通り、クライアントの作成は最初に行い、それを使用してReadRows/readRowの実行時間を測定しています。PHP(cli)ではcli.phpを使って測定しています。

nginx+php-fpmとapache+mod_phpではクライアントの作成からreadRowまで行う速度を測定しています。web.phpをサーバーに配置してweb server経由で実行しています。

また、キャッシュ等の影響が出ることを避けるためnginx, php-fpm, apacheはそれぞれ測定前に再起動しています。

今回の検証は以下のバージョンで行っています。

  • PHP: 7.4.33
  • Go: 1.20.1
  • Apache2: 2.4.54
  • nginx: 1.18.0

結果

結果は下記のグラフのようになり、どれを選択した場合も開始直後は遅くなりました。

PHP(cli)とGoと大きな差はありませんでした。

nginx+php-fpmとapache+mod_phpで、初回が極端に遅くなるのでプロファイルを確認したところ、初回はGoogle\Auth\FetchAuthTokenCache::saveAuthTokenInCacheが呼び出され、二回目からはGoogle\Auth\FetchAuthTokenCache::fetchAuthTokenFromCacheが呼び出されており、トークンがキャッシュされていました。

nginx+php-fpmについては初回と二回目が遅くなっていますが、このキャッシュがphp-fpmのWorkerごとに保存されていることが原因で、今回の検証では2つのWorkerが起動している状態でした。

このため、以下の平均値等の表の計算では最初の5回を除き、残り45回の結果を使用しています。

まとめ

BigtableをPHP(nginx+php-fpm, apache+mod_php)から使用する際、初回以外は17ms前後になりましたがGo, PHP(cli)に比べて3倍以上遅くなるので、速度を求める場合は別に接続を維持するアプリケーションを用意して間に挟むと良さそうでした。

下のグラフはHTTPでリクエストを受け、Bigtableからデータを返却する簡単なAPIをGoで作成し、それをnginx+php-fpmから使用した場合の結果を追加したもので、
平均5.09msとなりPHPから直接利用するよりも高速となりました。

20220927102812
mya0
インフラ部アルバイト。Kubernetesの構築をしています。JavaScriptとGoが好きです。