Linux ZFS 没有将写入缓冲到写入缓冲区(SLOG/ZIL)?

Linux ZFS 没有将写入缓冲到写入缓冲区(SLOG/ZIL)?

遇到写入 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
----------------  -----  -----  -----  -----  -----  -----

我的 /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

有没有办法配置 ZFS 来缓存对日志设备的写入,以便更快地确认?

谢谢

答案1

我认为您误解了 ZIL 的用途。您将其描述为写入缓存,但事实并非如此。ZIL 上没有活动可能只是正常行为,具体取决于您的机器上运行的内容。

ZIL 中不会读取任何内容,这是一个只写设备。唯一的例外可能发生在崩溃后的池导入过程中。

只有当应用程序执行同步写入时才会对其进行写入。常规 I/O(例如移动文件)不使用 ZIL。

您可以sync=always在数据集上进行设置,强制所有写入操作像同步一样进行。

相关内容