首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zfs发送性能

zfs发送性能
EN

Unix & Linux用户
提问于 2021-08-15 05:32:49
回答 1查看 148关注 0票数 3

在备份我的zfs文件系统时,我遇到了一个奇怪的性能问题。

我可以在100+ MB/s上查看zfs文件系统的内容,但是zfs发送的数据可能是5MB/S,文件系统只有5或6个快照。焦油大约需要1.5小时。一个zfs发送需要超过12个小时!

在这两种情况下,目标都是另一个池上的文件。(即zfs send tank/myfs > /backup/myfs.zfsbackuptar -cf /backup/myfs.tar ./myfs)

我的第一个想法是碎裂,但如果是这样的话,焦油就不会那么慢吗?

我得到了足够好的整体磁盘性能,但我的备份实际上需要花费很长时间。

我在x64硬件上运行Solaris 11.4。从概念上讲,这个问题可能类似于Linux上的zfs,但我对Linux变体并不那么熟悉。

在运行zfs send时,我在下面的答案中运行了大约12分钟的dtrace脚本。

代码语言:javascript
复制
dtrace -i 'profile:::profile-1001hz /arg0/ { @[ stack() ] = count(); }'

我不知道如何解释结果。摘要的两个部分包含了大量的zfs调用:

代码语言:javascript
复制
      zfs`zfs_fletcher_4_native+0x79
      zfs`zfs_checksum_compute+0x181
      zfs`zio_checksum_compute+0x1d6
      zfs`zio_checksum_compute_dispatch+0x28
      zfs`zio_checksum_generate+0x59
      zfs`zio_execute+0xb4
      genunix`taskq_thread+0x3d5
      unix`thread_start+0x8
     1041

      unix`bcopy+0x55a
      genunix`uiomove+0xb3
      zfs`dmu_xuio_transform+0x83
      zfs`zfs_write+0x78a
      genunix`fop_write+0xf5
      genunix`vn_rdwr_impl+0x1f3
      genunix`vn_rdwr_uiov+0x63
      zfs`dump_buffer_flush+0x8e
      zfs`dump_buffer_append+0x85
      zfs`dump_bytes_impl+0x49
      zfs`dump_bytes+0x49
      zfs`dump_record+0x190
      zfs`dump_data+0x26a
      zfs`backup_cb+0x4b5
      zfs`traverse_visitbp+0x3df
      zfs`traverse_visitbp+0x8e4
      zfs`traverse_visitbp+0x8e4
      zfs`traverse_dnode+0x1dc
      zfs`traverse_visitbp+0x6d2
      zfs`traverse_visitbp+0x8e4
     1183

调用数量最多的似乎是cpu空闲调用..。

代码语言:javascript
复制
          unix`mach_cpu_idle+0x17
          unix`cpu_idle+0x2b7
          unix`cpu_idle_adaptive+0x19
          unix`idle+0x11e
          unix`thread_start+0x8
      1147665

          unix`mach_cpu_idle+0x17
          unix`cpu_idle+0x2b7
          unix`cpu_idle_adaptive+0x19
          unix`idle+0x11e
          unix`thread_start+0x8
      2462890

在zfs发送过程中,驱动器很忙,但是没有等待,我不认为服务时间有那么糟糕.

代码语言:javascript
复制
                    extended device statistics
    r/s    w/s   Mr/s   Mw/s wait actv wsvc_t asvc_t  %w  %b device
 157.0    0.0    4.9    0.0  0.0  1.6    0.0   10.5   0  77 c0t5000C500A22D9330d0
 154.0    0.0    4.9    0.0  0.0  1.7    0.0   11.0   0  82 c0t5000C500A232AFA6d0
 186.0    0.0    6.4    0.0  0.0  2.4    0.0   12.7   0  93 c0t5000C500A24AD833d0
 185.0    0.0    6.3    0.0  0.0  1.8    0.0    9.9   0  79 c0t5000C500A243C8DEd0

在焦油中,磁盘的使用似乎非常相似.例如,r/s,服务时间,%繁忙等,但是读取的数据量却有很大的不同:

代码语言:javascript
复制
                    extended device statistics
    r/s    w/s   Mr/s   Mw/s wait actv wsvc_t asvc_t  %w  %b device
 158.0    0.0   33.3    0.0  0.0  1.9    0.0   11.9   0  86 c0t5000C500A22D9330d0
 190.0    0.0   31.9    0.0  0.0  1.6    0.0    8.3   0  75 c0t5000C500A232AFA6d0
 170.0    0.0   37.1    0.0  0.0  1.7    0.0    9.7   0  80 c0t5000C500A24AD833d0
 168.0    0.0   38.4    0.0  0.0  1.7    0.0   10.1   0  80 c0t5000C500A243C8DEd0
EN

回答 1

Unix & Linux用户

发布于 2021-08-17 15:27:08

在运行zfs send ...命令时,可以运行这个dTrace命令,以查看内核在何处花费时间:

代码语言:javascript
复制
dtrace -i 'profile:::profile-1001hz /arg0/ { @[ stack() ] = count(); }'

root的形式启动该命令,让它运行一段时间,按CTRL-C键停止它,然后它将发出它所采样的所有内核堆栈跟踪,按数量增加的顺序排列。

因此,最常见的堆栈跟踪将是最后找到的。这将是内核花费大部分时间的地方。

这些信息可能有帮助,也可能没有帮助。

或者,您可以将它保存在这样的文件中:

代码语言:javascript
复制
#!/usr/sbin/dtrace -s

profile:::profile-1001hz
/arg0/
{
    @[ stack() ] = count();
}

自从dTrace第一次出现在Solaris 10上以来,我就一直在使用这个小脚本。它可能是我遇到的最有用的dTrace脚本,因为它告诉您“系统到底在做什么?”

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/664721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档