Linux ZFS 不缓冲写入写入缓冲区 (SLOG/ZIL)?

use*_*162 7 linux zfs cache zfsonlinux

遇到写 I/O 时,日志列中zpool iostat -v永远不会显示任何 ZIL 活动。这导致将数据写入磁盘时的等待时间高于预期(有时在争用期间超过 80 毫秒)。

                     capacity     operations    bandwidth
    pool              alloc   free   read  write   read  write
----------------  -----  -----  -----  -----  -----  -----  
storage           1.88T  2.09T      3  3.01K   512K  39.3M
  mirror           961G  1.05T      0  1.97K   128K  20.8M
    mpathf            -      -      0    393      0  20.8M
    mpathg            -      -      0    391   128K  20.6M
  mirror           961G  1.05T      2  1.04K   384K  18.5M
    mpathi            -      -      1    379   256K  21.1M
    mpathj            -      -      0    281   128K  18.3M
logs                  -      -      -      -      -      -
  /zlog/zilcache      0  15.9G      0      0      0      0
cache                 -      -      -      -      -      -
  mpathk           232G     8M      1      0   130K      0
  mpathl           232G     8M      1      0   130K      0
----------------  -----  -----  -----  -----  -----  -----
Run Code Online (Sandbox Code Playgroud)

我的 /zlog/zilcache 设备从来没有任何 IO。这是一个非常快的闪存文件。当我从 ZFS 存储中删除它时,我可以写入和读取它,但 ZFS 似乎忽略了它。

该设备看起来可用:

  pool: storage
 state: ONLINE
  scan: scrub repaired 0 in 19h31m with 0 errors on Wed Nov 19 07:39:03 2014
config:

    NAME              STATE     READ WRITE CKSUM
    storage           ONLINE       0     0     0
      mirror-0        ONLINE       0     0     0
        mpathf        ONLINE       0     0     0
        mpathg        ONLINE       0     0     0
      mirror-1        ONLINE       0     0     0
        mpathi        ONLINE       0     0     0
        mpathj        ONLINE       0     0     0
    logs
      /zlog/zilcache  ONLINE       0     0     0
    cache
      mpathk          ONLINE       0     0     0
      mpathl          ONLINE       0     0     0

errors: No known data errors
Run Code Online (Sandbox Code Playgroud)

有什么方法可以配置 ZFS 以缓存对日志设备的写入以加快确认速度?

谢谢

jll*_*gre 6

我相信您误解了 ZIL 的目的。你将它描述为一个写缓存,但它不是。ZIL 上没有活动可能只是正常行为,具体取决于您的机器上运行的内容。

从来没有从 ZIL 读取任何内容,这是一个只写设备。唯一的例外可能发生在崩溃后的池导入期间。

如果应用程序正在执行同步写入,则只有对其进行写入。像移动文件这样的常规 I/O 不使用 ZIL。

您可以sync=always在数据集上进行设置以强制所有写入行为就好像它们是同步的一样。

  • 我发现了这个问题,由于某种原因,NFS 共享没有同步发送数据。我设置了sync=always,活动开始写入SSD。非常感谢同步中的输入和指针 (2认同)