syslogのパフォーマンスを改善できますか?
質問
syslog メカニズムを使用したLinux上のアプリケーションがあります。このアプリケーションの実行速度が予想よりも遅い理由を解明するために1週間を費やした後、syslogを削除し、ログファイルに直接書き込むだけでパフォーマンスが劇的に向上することがわかりました。
syslogが直接ファイル書き込みより遅い理由を理解しています。しかし、私は疑問に思っていました:syslogを設定してパフォーマンスを最適化する方法はありますか?
解決
「-」を前に付けることにより、ログメッセージの後にログファイルを同期しないようにsyslogd(および少なくともrsyslog)を構成できます。構成ファイル内のログファイルパス。これにより、パフォーマンスが向上しますが、クラッシュ時にログメッセージが失われる可能性があります。
他のヒント
syslogのパフォーマンスを改善するいくつかのオプションがあります。
-
マクロを使用した呼び出しの最適化
int LogMask = LOG_UPTO(LOG_WARNING); #define syslog(a, ...) if ((a) & LogMask ) syslog((a), __VA_ARGS__) int main(int argc, char **argv) { LogMask = setlogmask(LOG_UPTO(LOG_WARNING)); ... }
マクロを使用してsyslog呼び出しをフィルター処理する利点は、呼び出し全体が グローバル変数の条件付きジャンプに縮小され、非常に役立ちます 他の関数を介して大きなデータセットを変換するDEBUG呼び出しがあります。
-
setlogmask()
setlogmask(LOG_UPTO(LOG_LEVEL))
setlogmask()は/ dev / logにログを記録しないことで呼び出しを最適化しますが、プログラムは 引数として使用される関数を呼び出します。
-
syslog.confによるフィルタリング
*.err /var/log/messages
" syslog.confのmanページで詳細を確認してください。"
-
syslogが非同期またはバッファリングされたログを記録するように構成する
メタログはログ出力のバッファリングに使用され、ブロック単位でフラッシュされました。ストックsyslogおよびsyslog-ng 私の知る限りこれをしないでください。
新しいデーモンの書き込みを開始する前に、 syslog-ng 単純な古いsyslogよりも高速です(またはより高速に設定できます)。
ロギングアプリケーションのソースを制御する場合に使用できる1つのトリックは、syslog.confではなく、アプリ自体で必要なログレベルをマスクすることです。私はこの数年前に、巨大で巨大な膨大な量のデバッグログを生成するアプリを使用しました。本番コードから呼び出しを削除するのではなく、デバッグレベルの呼び出しがデーモンに送信されないようにマスクしました。実際にコードを見つけました。それはPerlですが、setlogmask(3)呼び出しの前線にすぎません。
use Sys::Syslog;
# Start system logging
# setlogmask controls what levels we're going to let get through. If we mask
# them off here, then the syslog daemon doesn't need to be concerned by them
# 1 = emerg
# 2 = alert
# 4 = crit
# 8 = err
# 16 = warning
# 32 = notice
# 64 = info
# 128 = debug
Sys::Syslog::setlogsock('unix');
openlog($myname,'pid,cons,nowait','mail');
setlogmask(127); # allow everything but debug
#setlogmask(255); # everything
syslog('debug',"syslog opened");
ビットマスクの代わりに10進数を使用した理由がわからない... shrug
独自のsyslog実装を作成します。 :-P
これは2つの方法で実現できます。
- 独自の
LD_PRELOAD
フックを作成してsyslog関数をオーバーライドし、代わりにstderr
に出力するようにします。私は実際にこれについて何年も前に投稿しました: http://marc.info/?m=97175526803720 :-P - 独自のsyslogデーモンを作成します。
/ dev / log
からデータグラムを取得するだけです。 :-P
さて、さて、これらは両方とも面倒な答えです。 syslogd
のプロファイルを作成して、最も詰まっている場所を確認しましたか?
ログファイルへのパスの前にマイナス記号を付けることで、syslogdのレベル(または機能)を非同期に記録するように設定できます(例:user。* [tab]-/ var / log / user.log)。
乾杯。
syslog-async()の実装は、他の場合にログ行の損失や制限された遅延のリスクがある場合に役立ちます。 http://thekelleys.org.uk/syslog-async/
注:ここで「非同期」とは、アプリケーション内のログイベントをキューに入れることを指し、他の回答が参照する非同期syslogd出力ファイル構成オプションではありません。