asyncioで低レイテンシ(100us〜1ms)で応答出来るサービスを実装するにあたって、何かtipsはありませんでしょうか?
今のところ思いつくのは、
- TCPではなくUDPを使う
- uvloopが使える環境であれば使う
- streamではなくprotocolで実装する
- Cythonが使えるところは使う
- 標準ライブラリも一部Cython化する
- sleepはtimeでもasyncioでもしない
- Profileで見て削れそうなところは削る
- 実測値が一番速い組み合わせのPython 3.6 + uvloop 0.8.1を使う
- 処理単位が大きくならないように適宜awaitを挟む
- なるべくCモジュールを使う
- Python自体の最適化オプションを有効にしたビルドを使用する
です。
今、単純なPing Pongが200〜300usくらいなのですが、なんかまだスケジューリングやI/O周りで変な待ちが発生している気がします。
思いつきで結構なので、何か気付きのヒントを頂けないでしょうか。例えばprint()は使わない等々。よろしくお願いします。
追伸 ... 「PythonではなくGoやCを使おう」は無しの方向でお願いします。Python以外では自分の生産性レベルが著しく落ちてしまいます。
後日談 ... CPUの省電力機能を切ったりしてもジッタが軽減されて幸せになれました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/30 23:55 編集
2018/05/31 10:07