1

uWSGI で gevent ループを使用しており、redis キューに書き込みます。約 3.5 qps を取得します。場合によっては、redis 接続に問題が発生することがあります。失敗した場合は、別のプロセスで後でクリーンアップを行うファイルに書き込みます。私のアプリは非常にレイテンシーを認識しているため、Python でディスクにダンプする最速の方法は何ですか? Python ロギングで十分でしょうか?

4

2 に答える 2

2

待ち時間がアプリにとって重要な要素である場合、ディスクへの無期限の書き込みは事態を非常に悪化させる可能性があります。

redisがまだダウンしている間にサーバーの再起動を乗り切りたい場合は、ディスクに書き込む以外に解決策がありません。それ以外の場合は、ramdiskを試してみてください。

redis の 2 番目のインスタンスを持つ 2 番目のサーバーを持つことは、より良い選択ではないでしょうか?

ロギングに関しては、オーバーヘッドが少ないため、単純に低レベルの I/O 関数を使用します (マシン サイクルが非常に少ない場合でも)。

于 2012-10-27T10:06:43.977 に答える
1

ディスク上のファイルへの追加は高速です。

:~$ 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。これにより、各関数にかかる時間と、アプリケーションが時間を費やしている場所がわかります。私はそれが主にログエラーにあるのではないかと真剣に疑っています。

于 2012-10-27T10:53:16.547 に答える