2015年9月6日日曜日

[CentOS6] NFSクライアントがNULLを返す


たまたま、下記のページを見つけた。
NFS3(非同期)の場合、
  1. NFSサーバ側で、常にデータをファイルに書き込む。
  2. NFSクライアント側で、tail コマンドでデータを読み込む。
といったことをすると、
NFSクライアントがデータをNULL(0x00)で置き換えることがあるそうです。
ファイルの属性情報とNFSキャッシュのデータがずれることが原因みたい。

そんなことあるのか? と思い、CentOS6で試してみました。

NFSサーバの設定は以下のようにします。
[root@pm01 ~]# cat /etc/exports
/data 10.1.0.0/24(rw,no_root_squash,async,wdelay)
NFSサーバ側で以下のように実行して、0.1 秒間隔で 10個のファイルに "abc" を書き込みます。
[root@pm01 ~]# for f in /data/file{00..09}; do while true; do echo 'abc' >> ${f}; sleep .1; done & done
[1] 2356
[2] 2357
[3] 2358
[4] 2359
[5] 2360
[6] 2361
[7] 2362
[8] 2363
[9] 2364
[10] 2365
[root@pm01 ~]#
NFSクライアント側では、NFSver3 でマウントし、rsize/wsize を大きい値に設定します。
マウント後、tail コマンドを実行して、ファイルを監視すると、NULL(0x00)が出ました。(赤字部分)
[root@pm02 ~]# mount -t nfs -o nfsvers=3,rsize=32768,wsize=32768 10.1.0.71:/data /mnt
[root@pm02 ~]# for f in /mnt/file{00..09}; do tail -f ${f} | hexdump -C & done
[1] 2498
[2] 2500
[3] 2502
[4] 2504
[5] 2506
[6] 2508
[7] 2510
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
[8] 2512
[9] 2514
[10] 2516
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
[root@pm02 ~]# 00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*

[root@pm02 ~]# 000001f0  61 62 63 0a 00 00 00 00  61 62 63 0a 61 62 63 0a  |abc.....abc.abc.|
00000200  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000610  61 62 63 0a 00 00 00 00  61 62 63 0a 61 62 63 0a  |abc.....abc.abc.|
00000620  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*


fluentd の in_tail プラグインを使うときは注意しよう。。。