2012-04-19 9 views
4

このコードを実行しているボックスに4つ、8つ以上のスレッド&のクラスタがある場合、ログファイル/ファイルライターに対してリソース競合が発生する可能性がありますか?もしそうなら、あなたは例を掲示することができますか?これまでに行ったすべてのテストでは、書き込みデータが織り込まれずに破棄されないことが示されていますが、私は100%確信していません。Node.jsのファイルにロギングする:クラスタで安全ですか?

ありがとう!

var errLog = fs.createWriteStream(... + '/error.log'); 
GLOBAL.dbLog = fs.createWriteStream(... + '/db.log'); 
+0

あなたのプラットフォームの 'PIPE_BUF'制限より大きなチャンクでテストしましたか? (私のシステム上の '/ usr/include/linux/limits.h'は' PIPE_BUF'から '4096'バイトまでを定義しています。あなたのプラットフォームは異なるかもしれません) – sarnold

+0

私はしませんでした。これが物事に影響を与えると言っていますか?もしそうなら、その解決策は何ですか? – ControlAltDel

+0

私はそれが結果に影響を与えるだろうという疑いがありますが、それはちょっと疑わしいことです。 – sarnold

答えて

4

質問がダウンOSがファイルに複数のオープン書き込みストリームを許可するかどうかに来るように、スレッドやクラスタ化されたプロセスのないコーディネートは、ありません。 CreateWriteStreamのデフォルトのCフラグはO_WRONLY || O_CREAT || O_TRUNCです。これは最初の問題を示しています。すべてのプロセスが新しい切り詰めファイルを作成しています(おそらく追加したい場合)。

のでthis related questionは、バイト数は、Linux上の4096(PIPE_BUFバイト未満であるとあなたは限り大丈夫だろうことを示している、Linuxの場合

...ストリームの作成時にフラグとしてw+を指定していると仮定いくつかの他のUnixでは512です)。

答えはWindows上ではわかりません。

+0

ストリームの作成時にW +をどのように指定しますか?私はfs.createWriteStream(path、[options])を呼び出していますが、これは可能なオプションですか?ドキュメントには記載されていません。また、私のシステムでPIPE_BUFを変更する方法はありますか?私はunixの3つの異なるフレーバーを使用しています - macOS、centOS、およびubuntu – ControlAltDel

+0

[docs](http://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options)は 'w'の使用例を示しています。それを 'w +'で置き換えることができます。 Linuxのソースコードを編集して再コンパイルするのに手間がかかりませんが、PIPE_BUFを変更する方法はありません(コンパイルされた定数です) –

+0

ありがとうございます! – ControlAltDel

関連する問題