仮想コンテナ(VMware)で実行され、ローカルストレージが不足している非常にトラフィックの多いWebサイトでは、ログファイル(リモートネットワークストレージにある)への直接ログインからに切り替えることで、スループット(1秒あたりのリクエスト数)を大幅に増加させることができましたrsyslogd。
基本的に、同期ロギングから非同期ロギングに切り替えました。 Webサーバーワーカーはsyslog(3)を使用してメモリバッファーに書き込み、rsyslogd(8)を使用して、並行して、独自のペースでデータを実際のファイルに送信します。ロギング時にプロセスはIOでブロックしません。
ここまでは順調ですね。問題は、たまにrsyslogdが書き込まれないようにし(たとえば、一時的/長時間のネットワーク停止)、着信バッファがすぐにいっぱいになることです。
私の質問は:
最初の質問に対する答えは次のとおりです。
はい、syslog()の呼び出しはすべてブロックしています。おそらく非常に短い時間ですが、それでもファイル記述子を含む同期呼び出しです。詳細については、
man 3 syslog
を参照してください。
サーバーが非同期アーキテクチャとプリミティブを使用しない限り、常に何らかのロックが発生します。このログは軽減できますが、ログに別のスレッドを使用するなどして排除することはできません。他の2つの質問については、実際にはわかりませんが、rsyslogdのソースコード(およびsyslog()ファミリーの関数のコード)を調べることが唯一の方法です。
より一般的には、UDP:514 "ネットワークsyslogプロトコル"を介して外部サーバーにロギングを移動すると、ロックをほぼゼロに作成する可能性がもたらされます。高負荷時に一部のロギングが失われる可能性の欠点を使用します。
最初、「発信元」サーバーでは、すべてのロギングがsyslog経由で行われるようにする必要があります。たとえば、Apache2では次を指定する必要があります。
ErrorLog "syslog:daemon"
他のサーバーについては、適切なマニュアルページを参照してください。これを確認できない場合は、ファイルシステムへのログオンが作成される可能性があることに注意してください
Second、元のrsyslogd構成では、選択したファシリティ(この例では「デーモン」)のすべてのsyslogトラフィックを1つ以上の外部syslogサーバーに転送するように要求します。 rsyslog構成ファイルでは、次を指定できます。
daemon.* @192.168.128.1
daemon.* @192.168.254.1
ログの2つのコピーを同時に2つの異なるサーバーに送信する。
Third、宛先サーバーで、UDP:514を介したsyslogメッセージの受信を有効にします。 (宛先)rsyslogd構成ファイルにあり、通常はdefualtによって無効になっています(先頭の#を削除するだけで十分です)。
$ModLoad imudp
$UDPServerRun 514
4番目、オプションですが、強くお勧めします。高解像度のタイムスタンプも有効にします。
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
また、このオプションは通常、デフォルトで無効になっています(なぜですか?)。
私の知る限り、rsyslogのメインメッセージキューのデフォルトモードは固定サイズの配列です。 1万個程度の要素に制限があります。これをリンクリストキューに変更してみてください。不定期のメッセージバーストをはるかにうまく処理できるはずです。
はい、FixedArray
およびLinkedList
キューがあります。