uWSGI で gevent ループを使用しており、redis キューに書き込みます。約 3.5 qps を取得します。場合によっては、redis 接続に問題が発生することがあります。失敗した場合は、別のプロセスで後でクリーンアップを行うファイルに書き込みます。私のアプリは非常にレイテンシーを認識しているため、Python でディスクにダンプする最速の方法は何ですか? Python ロギングで十分でしょうか?
2 に答える
待ち時間がアプリにとって重要な要素である場合、ディスクへの無期限の書き込みは事態を非常に悪化させる可能性があります。
redisがまだダウンしている間にサーバーの再起動を乗り切りたい場合は、ディスクに書き込む以外に解決策がありません。それ以外の場合は、ramdiskを試してみてください。
redis の 2 番目のインスタンスを持つ 2 番目のサーバーを持つことは、より良い選択ではないでしょうか?
ロギングに関しては、オーバーヘッドが少ないため、単純に低レベルの I/O 関数を使用します (マシン サイクルが非常に少ない場合でも)。
ディスク上のファイルへの追加は高速です。
:~$ time echo "this happened" >> test.file
real 0m0.000s
user 0m0.000s
sys 0m0.000s
Pythonを使用してファイルに追加することは、bashとほぼ同じ桁数のようです。ロギングモジュールは少しオーバーヘッドを追加するようです:
import logging
import time
logging.basicConfig(filename='output_from_logging')
counter = 0
while counter < 3:
start = time.time()
with open('test_python_append', 'a') as f:
f.write('something happened')
counter += 1
print 'file append took ', time.time() - start
counter = 0
while counter < 3:
start = time.time()
logging.warning('something happened')
counter += 1
print 'logging append took ', time.time() - start
これにより、次の出力が得られます。
file append took 0.000263929367065
file append took 6.79492950439e-05
file append took 5.41210174561e-05
logging append took 0.000214815139771
logging append took 0.0001220703125
logging append took 0.00010085105896
しかし、壮大な計画では、この操作がコードベースの非常にコストのかかる部分になるとは思えず、おそらく心配する価値はありません。レイテンシーが心配な場合は、コードのプロファイルを作成する必要がありますpython -m cProfile code_to_test.py
。これにより、各関数にかかる時間と、アプリケーションが時間を費やしている場所がわかります。私はそれが主にログエラーにあるのではないかと真剣に疑っています。