カテゴリー別アーカイブ: PHP

isucon4予選AMIが公開されたのでPHPでやってみた(score:54491)

前置き

人がやったことは見ないようにはしてたけど、

まあ概要知っちゃってるし、

合間の時間でやったために合計で何時間かかったかは

分からない(体感では実作業時間は合計10時間くらい)ので、

それなりに良いスコアが出ましたが、

自慢でもなんでもなく、ただの自己満であり、兼メモです。

 

やったこと

  • MySQL5.6への入れ替え&チューニング
    • MySQLの存在感がほぼ無くなったので意味無かったw
  • Nginxの細かいチューニング(参考
  • Sessionの保存先をtmpfsに移す
  • ついでに静的ファイルもtmpfsに移す
    • 再起動時に消えるとOUTなので、
      /etc/rc.localに移すコマンドを入れておく
  • トップページの静的ファイル化
    • 初めはプロキシキャッシュにしようとしたんですが、
      Session IDのSet-Cookieもキャッシュされるため(?)
      ダメだったので諦めました
    • ベンチマークではクエリストリングを見てなかったので、
      クエリストリングを目印に返す対象をrewriteする
  • php-fpmのプロセス数調整
    • プロセス数は固定
      pm=static
    • プロセスの再生成は行わない
      pm.max_requests=0
    • 結果的にはNginx、php-fpm共に
      CPUコア数(4)と同じプロセス数がベストだった。
  • Opcacheのスクリプト更新チェックや不要なオプションをOFFにする
    opcache.revalidate_freq=0
    opcache.validate_timestamps=0
    opcache.save_comments=0
    opcache.load_comments=0

  • データを全てAPCuキャッシュに載せる
    • login_logはINSERTはするけど、
      永続化が必須条件の最後の集計だけのために使う
    • login_logは単純に置き換えるのではなく、
      必要な形で集計した値
    • usersはそのまま
    • 初期化処理でDBに入るデータは、
      初期化処理の最後でAPCuに写す
  • APCuキャッシュによって、
    login_logは遅延書き込みが許されるようになったため、
    ENGINE=MyISAMにしてINSERT DELAYED文にして非同期化
  • 集計処理がタイムアウトするようになったので、
    少しだけインデックス追加

実際の設定ファイルやらソース

 

結果

[isucon@ip-10-175-1-202 ~]$ ./benchmarker bench --workload='8'
13:54:13 type:info message:launch benchmarker
13:54:13 type:warning message:Result not sent to server because API key is not set
13:54:13 type:info message:init environment
13:54:36 type:info message:run benchmark workload: 8
13:55:36 type:info message:finish benchmark workload: 8
13:55:41 type:info message:check banned ips and locked users report
13:55:43 type:report count:banned ips value:1033
13:55:43 type:report count:locked users value:5071
13:55:43 type:info message:Result not sent to server because API key is not set
13:55:43 type:score success:252250 fail:0 score:54491

 

ということで、

あと少しで、しばらくPHP書かなくなると思うので、

最後に腕試しを兼ねてやってみた。

実際に参加して、時間制限内に同じことができるかというと、

たぶん無理だけど、予選結果の中でも上位で、

PHP実装の中では一つ頭抜けたスコアが出せたので、

心置きなくPHP卒業(?)できますw

 

来年は相棒見つけて出たいなー

 


「PHPはクソ言語」は間違いでした

最近、愚痴っぽくて自分でも嫌になります。

業務でPHPが一番多く使う言語なのですが、

少し前までなんというクソ言語…

と思っていました。

PHPなんて敷居の低いお手軽言語使うからクソみたいなソース書く奴が出てくるんだよ。

Javaで良いじゃんJavaで。

みたいな。

でも、それは間違いだと思うようになりました。

何が間違っていたと思うかというと、

PHPが敷居の低いお手軽言語であるという認識です。

PHPやその他RubyやPythonといったLL言語がなんのためにあるのか?

確かに、「簡単に扱える」「制約が少なくて柔軟」というのは最大の特徴であり、利点です。

ですが、それらは敷居の低いお手軽言語としての特徴ではなく、

より人間の思考に直結したプログラムを書くための言語であると思うのです。

例えば、よく槍玉に挙げられる「変数の型宣言が無い」
という点について、

「変数の型を意識してプログラミングしなくてはならない」とか、

「接頭語に型名をつけよう」というのは間違いだと思うのです。

普段、物事を考える時に先に型を意識しますか?

しないですよね?

商品.金額といったら当然数値で、

商品.名前といったら当然文字列である。

それは、意識するまでもなく自然と理解して扱っているわけです。

PHPやその他のLL言語はそうやって、

パッと見てすぐ理解できる自然なオブジェクト指向で書くべきだと思うのです。

まあだからといってPHPを別に好んで使いたくはならないんですけどねw

だって、上記を一番体現しているのは、

ちゃんと使ったことが無いのであくまでなんとなくですが、

Ruby辺りだと思うのでw

でも、PHPも最近変わってきたみたいで、

他言語の良い所を積極的に取り入れる感じになってきてたり、

ソース管理がGitになってたり、

ファイル配布がAmazon S3になってたりして、

なんか変革が起きてるっぽいのでちょっと期待しています。