2014年07月10日

タイトルですべてを語っていますし、http://blog.livedoor.jp/sonots/archives/32645828.html あたりを読むと良いのですがメモ。

最初にまとめると

  • CORE::print() を使う場合は 4096 or 8192 byte 以下に収めること
  • CORE::syswrite() なら混ざらない
  • 男は度胸。flock(2)する

ということです。
これでわかった人は読む必要ありません。

以下蛇足。

はじめに

perl ではファイルハンドルに書き込むときには何も考えずに CORE::print() を利用しますが、この人はなんかいい感じにバッファリングしたり、長い文字列だったらぶった切ってくれたりしてくれます。

で、普通はバッファリングのことはみんな意識しているので以下のようにヒットアンドアウェイをやったりしますね。close() で自動的に flush されるので、まぁだいたい autoflush(1) しているのと同じでしょうという発想です。

open my $fh, '>>', $file;
print $fh $message, "\n";
close $fh;

大抵のケースでは嬉しい事にこれでログが混ざらずに綺麗に見れます。
しかし、超絶に長いメッセージを書き込もうとした場合にこれだと混ざる可能性があります。

分割されてしまうサイズを調べる

超絶長いのがいくつかというとこれまた環境によって異なるのですが、以下のようにするとさくっとわかります。

$ cat > foo.pl
my $s = 'a' x (1024 * 100);
open my $fh, '>>', "/tmp/$$";
print $fh $s;
close $fh;
^D
$ strace perl foo.pl 2>&1 | grep write
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
...

とかなって、write(2) が複数回呼ばれていることがわかりますね。
そして、どうやら 8192byte で切られている模様です。*1

こうなると、普通にマルチプロセスで書き込んでいた場合は context switch が発生してログが混ざること請け合いですね。

具体的には以下のようにすると簡単に確認できます。

$ cat > bar.pl
my $char = shift || 'X';
my $str = $char x (1024 * 10); # 8096 byte 以上書き込む

for (1..1000) {
    open my $fh, '>>', '/tmp/test';
    print $fh $str, "\n";
    close $fh;
}
^D
$ perl bar.pl A &; perl bar.pl B &
$ grep A /tmp/test | grep B | wc -l
13

13行ぐらい混ざっちゃったっぽい!

syswrite を使う

print() では混ざっちゃうことが確認できたので、syswirte を使いましょう。

$ cat > hoge.pl
my $s = 'a' x (1024 * 100);
open my $fh, '>>', "/tmp/$$";
syswrite $fh, $s;
close $fh;
^D
$ strace perl hoge.pl 2>&1 | grep write
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 102400) = 102400

こうすると、write(2) 一回だけになっていることがわかります。
上記の記事にあるように write(2) 一発は atomic であることがある程度保証されているので、基本的にはこれだけでおっけーでしょう。

ファイルシステムのことを気にしたくないひと

flock(2) しましょう。

まとめ

でかいログを吐かない。

  • *1 : ちなみに 4096 の環境もありました。 PERLIOBUF_DEFAULT_BUFSIZ だと思ったけど違うのかな?
xaicron at 02:40コメント(28)Perl   このエントリーをはてなブックマークに追加
編集

コメント一覧

1. Posted by kata kata mutiara   2014年09月22日 16:42
非常に良いニュース、そして興味深い観察する
2. Posted by jasa fotocopy murah   2014年09月25日 19:06
書き込みは、注意することは興味深い
3. Posted by tempat fotocopy dan percetakan murah di jakarta   2014年09月26日 22:14
注意することは興味深く、良いニュースは、ありがとう
4. Posted by pakar seo   2014年10月02日 22:43
良いニュースと面白い、ありがとう
5. Posted by ucapan selamat ulang tahun   2014年10月03日 20:11
これ以上の興味深い最新のニュースの更新
6. Posted by cetak yasin   2014年10月12日 21:59
ジャカルタの場所印刷とブック安いヤシンレター
7. Posted by Harga Hp   2014年10月22日 03:23
良いニュースは、ありがとう
8. Posted by トップス水着   2015年01月22日 15:10
59013カウンりスケ月5ら、がイカウンりスケ月5
9. Posted by kata kata galau   2015年06月29日 17:49
私はこれに非常に感銘を受けました。すべては非常に明確な分類と非常にオープンです。私はウェブサイトのように好きですし、木箱は非常に便利です。
10. Posted by percetakan yasin murah   2016年05月08日 22:41
良い記事、共有するためのおかげで
成功挨拶
11. Posted by nonton tv   2016年06月08日 08:54
これ以上の興味深い最新のニュースの更新
12. Posted by Kata Kata Remaja   2016年10月18日 18:44
私はこれに非常に感銘を受けました。すべては非常に明確な分類と非常にオープンです。私はウェブサイトのように好きですし、木箱は非常に便利です。
非常に良いニュース、そして興味深い観察する
14. Posted by Cetak Murah Rawamangun Jakarta Timur   2016年10月21日 03:43
これ以上の興味深い最新のニュースの更新
15. Posted by NFL Snapback Hats   2016年12月26日 20:34
そして、どうやら 8192byte で切られている模様です。
16. Posted by Salomon Speedcross 3   2017年01月10日 10:14
具体的には以下のようにすると簡単に確認できます。
17. Posted by Salomon Speedcross 3   2017年01月10日 10:14
具体的には以下のようにすると簡単に確認できます。
18. Posted by Cetak Murah Rawamangun Jakarta Timur   2017年02月11日 06:53
私はこれに非常に感銘を受けました。すべては非常に明確な分類と非常にオープンです。私はウェブサイトのように好きですし、木箱は非常に便利です。
19. Posted by Chaussures Nike Air Max Zero   2017年03月22日 12:20
具体的には以下のようにすると簡単に確認できます。
20. Posted by Percetakan murah di Jakarta   2017年03月30日 05:34
私はこれに非常に感銘を受けました。すべては非常に明確な分類と非常にオープンです。私はウェブサイトのように好きですし、木箱は非常に便利です。
21. Posted by MURNI JAYA Printing   2017年09月27日 08:37
私はこれに非常に感銘を受けました。すべては非常に明確な分類と非常にオープンです。私はウェブサイトのように好きですし、木箱は非常に便利で
22. Posted by djleymonremix   2017年12月27日 04:21
注意することは興味深く、良いニュースは、ありがとう
23. Posted by PERCETAKAN ANGKASA GRAFIKA   2018年01月10日 12:55
私はこれに非常に感銘を受けました。すべては非常に明確な分類と非常にオープンです。私はウェブサイトのように好きですし、木箱は非常に便利です。
24. Posted by Free Download Lagu Mp3 Dugem House Music Nonstop Remix Terbaru   2018年04月24日 02:36
具体的には以下のようにすると簡単に確認できます。
25. Posted by Cetak Buku Murah Jakarta Timur   2018年07月30日 22:43
私はこれに非常に感銘を受けました。すべては非常に明確な分類と非常にオープンです。
26. Posted by Tempat Jasa Print Warna murah - online 24 Jam - Jakarta Timur - Rawamangun   2018年12月30日 08:19
すべては非常に明確な分類と非常にオープンです。私はウェブサイトのように好きですし、木箱は非常に便利です。
27. Posted by Cetak Note Book Murah di Jakarta Timur   2018年12月30日 08:20
私はこれに非常に感銘を受けました
28. Posted by jasa cetak. print , copy dan jilid murah cepat jakarta 24 jam online   2019年01月07日 23:54
具体的には以下のようにすると簡単に確認すべては非常に明確な分類と非常にオープンです。私はウェブサイトのように好きですし、木箱は非常に便利です。できます

コメントする

名前:
URL:
  情報を記憶: 評価:  顔   星
  絵文字
 
 
プロフィール

Perlが少しだけ出来る気になってます。
JavaScriptはよくわかりません。
Rubyもちんぷんかんぷんです。
Pythonは難しいです。
ActionScript勘弁してください。
Javaあばばばばば。
低級言語できません。

github
記事検索
  • ライブドアブログ