memcached の conn_yields について
memcached の conn_yields が上がっていた場合、conn_yield がでなくなるまで起動時オプションの -R を上げろって主張している人がいます。
- https://blog.engineyard.com/2015/fine-tuning-memcached
- http://cachelot.io/blog/2015/04/20/Speed-up-your-application-by-fine-tuning-Memcached.html
実際問題、結局のところどういう主張なのかわかりづらくて、調べた。
コードを検索すると、1つのコネクションでコマンドを発行しまくっている場合にここに到達するようだ。 https://github.com/memcached/memcached/blob/d9dfbe0e2613b9c20cb3c4fdd3c55d1bf3a8c8bd/memcached.c#L4667
「1つのクライアントがリクエストを投げすぎている場合に、スレッドを専有してしまってそれにともなって memcached にアクセスしているクライアント全体がパフォーマンス劣化するという問題に対応する」ために導入されているようだ。
1つのコネクションでコマンドを投げまくっていると、conn_yields が発生する。 events_per_request(-R で渡してる値) が低すぎると、バッチリクエストの最中に yield 発生しまくって非効率なので、conn_yields が上がっている場合には適宜増やした方がいい。
ただし、上げすぎると、安全弁としての役割を果たさなく鳴るので、すごい勢いで memcached を呼びまくるクライアントが一台いただけで、全体的なパフォーマンスが悪化するかも。という気もする。
- https://github.com/memcached/memcached/commit/a21f819a15274ae1f2f5826b9a6aaa97fc565a3a
- https://code.google.com/archive/p/memcached/issues/61
- https://github.com/memcached/memcached/commit/ca90710f52f45e948e0571336f5b1007015478b8
- https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L651-L652