我正在尝试测量特定进程在指定持续时间内对特定卷执行的磁盘写入和读取总量。
我找到了 iotop,它可以每秒为特定进程输出 IO,如下所示:
iotop --batch --pid $(pidof my_process)
Run Code Online (Sandbox Code Playgroud)
您可以在其中指定 x 迭代-n x。
但后来我必须过滤掉实际数字,并自己计算出来。
有没有更简单的方法来做到这一点?
配置是:一个linux服务器和一个作为nfs服务器的nas box(netgear)。
通过简单地将文件从 nfs 共享复制到 nfs 共享,Linux 服务器上的单个进程很容易使用所有 I/O 带宽。i/o 通道被阻塞,服务器上的所有其他进程将几乎停止等待 i/o。负载增长到 10-20(四核),越来越多的 pdflush 进程出现......直到有人停止文件复制。
如何限制 cp 进程使用的 i/o 带宽?nice当然不会有帮助,但也ionice -c3没有效果。ionice 是否会影响 nfs 挂载?有类似nfsnice 的东西吗?
我的新服务器的 I/O 性能非常低。我用谷歌搜索并尝试了我能想象到的一切。首先,这是硬件组件:
目前它运行在软件 RAID5 上。
主机的吞吐量:
# dd if=/dev/zero of=testfile bs=64k count=16k conv=fdatasync
16384+0 records in
16384+0 records out
1073741824 bytes (1.1 GB) copied, 4.44095 s, 242 MB/s
Run Code Online (Sandbox Code Playgroud)
访客系统上的当前吞吐量:
# dd if=/dev/zero of=testfile bs=64k count=16k conv=fdatasync
16384+0 records in
16384+0 records out
1073741824 bytes (1.1 GB) copied, 94.8643 s, 11.3 MB/s
Run Code Online (Sandbox Code Playgroud)
我使用的是自编译的 QEMU + LIBVIRT,加上自编译的 Linux 内核(3.10.32-lns-opteron-kvmhost)。我可以提供内核配置之外的部分。
我在另一个系统(相同的处理器,但其他硬盘)上运行两个内核,该系统正在以完整的 I/O 性能运行。
我没有安装其他系统,所以我无法可靠地重现该问题。
来宾的硬盘配置:
<disk type='block' device='disk'> …Run Code Online (Sandbox Code Playgroud) 一个LBA(逻辑块地址)是在实施的映射表FTL在逻辑和物理页/块之间匹配的SSD,我的猜测是,大多数固态硬盘(至少当它们是空的)保持所述物理地址中的相同顺序逻辑地址(物理地址 0 映射到逻辑地址 0,1 映射到 1,依此类推)。
当页面更改时,SSD控制器将更新的页面复制到缓存,更改页面,将旧页面标记为“无效/陈旧”,然后将新页面写入不同的位置并更新 LBA。
因此,即使物理地址与逻辑地址对齐,在几次写入之后,这个顺序也会被搞乱!
为什么顺序写比随机写有更好的性能呢?
编辑
无论块大小或队列深度如何,顺序写入和随机写入之间都缺乏性能。
我们的一个开发箱出现了一个问题,即性能偶尔会下降。发生这种情况时,您可以听到硬盘抖动的声音,但我不知道是什么原因造成的。
这发生在高磁盘访问期间(读取/写入多 GB 文件),但不是每次或整个磁盘访问期间。这些文件也经过严格的碎片整理,以防止似乎正在发生的那种“寻求颠簸”。
我怀疑问题在于系统的防病毒软件或某些我不知道的磁盘索引服务(AFAIK,没有任何运行,但是......)。不幸的是,我的 Performance Monitor-fu 非常非常弱(好吧,几乎不存在),我不知道如何确认/反驳我的怀疑或找出真正的罪魁祸首。
更新:
Process Explorer为我找到了罪魁祸首——Java 快速入门和 Windows 搜索服务。关闭前者对性能有显着影响,而关闭后者则产生巨大影响(尽管没有获得任何文件访问权限)。两者执行的磁盘访问量都是其他任何进程的 5-20 倍。
感谢你的帮助!
我很好奇,从性能的角度来看,将所有文件存储在一个目录中与将每个文件存储在一个单独的目录中是否有优势?我不关心组织。
此外,这是假设文件将被经常访问——因此 I/O 使用率会很高。不涉及目录列表,文件将通过绝对路径拉取。
系统环境为Linux,CentOS 5.3。
刚刚用 iSCSI 设置了一个穷人的 SAN 并想对其进行基准测试。除此以外,还有哪些适用于 Linux 的良好 I/O 性能基准测试:
hdparm -tT /dev/sda1
Run Code Online (Sandbox Code Playgroud)
如何获得 IOPS 测量值?
谢谢。
我有一个服务器,它通过 NFS 导出主目录。它们位于软件 RAID1(/dev/sdb 和 /dev/sdc)上,操作系统位于 /dev/sda 上。我注意到我的%iowait报告top和sar相对较高(与其他服务器相比)。值范围在 5-10% 之间,至于其他服务器(比这台服务器负载更多)与 0-1% 相同。当%iowait达到 12% 以上时,所谓的用户体验就会下降。然后我们会经历延迟。
我在日志中没有任何驱动器错误。我想避免使用试错法来玩驱动器。
如何找出哪个设备(/dev/sda、/dev/sdb 或 /dev/sdc)是瓶颈?
谢谢!
编辑:我使用 Ubuntu 9.10 并且已经iostat安装。我对 NFS 相关问题不感兴趣,但更多的是如何找到使系统变慢的设备。NFS 没有加载,我有 32 个线程可用,结果是
grep th /proc/net/rpc/nfsd
th 32 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
Run Code Online (Sandbox Code Playgroud)
Edit2:这是iostat -x 1输出的一部分(我希望我没有在这里违反一些规则):
avg-cpu: %user %nice %system %iowait %steal %idle
45.21 0.00 0.12 4.09 0.00 50.58
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz …Run Code Online (Sandbox Code Playgroud) 我目前正在 3 台服务器上通过 Nginx 提供会议视频;4 个内核、足够的内存(不使用交换)和 RAID-10,每台服务器有 8 个驱动器。不幸的是 iostat -xd 1 在所有 3 个服务器上都给了我 100% 并且 iotop 显示 Nginx 吃掉了 99-100%。
我一直在考虑分布式 FS(但哪一个有帮助?);除了购买新服务器(涉及所有开销......)之外,还有其他方法可以防止这种情况发生吗?
请注意,无法将视频放入内存中;太多了,而且太大了。分配也不能只在内存中放入几个。
我正在将数据迁移到 LUKS 分区。现在操作系统驱动器正在运行 LUKS,我尝试开始迁移数据驱动器。然后服务器停止响应。
此 LUKS 设备已打开:
cryptsetup luksOpen /dev/sdc data1
Run Code Online (Sandbox Code Playgroud)
这些命令中的任何一个都扼杀了服务器:
pv /dev/zero > /dev/mapper/data1
pv /dev/zero > /dev/sdc
Run Code Online (Sandbox Code Playgroud)
不是立即,而是在几秒钟内,服务器变得非常缓慢。在 I/O 上阻塞的所有内容:
root@node51 [~]# ps aux | awk '{if($8~"D"||$8=="STAT"){print $0}}'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1197 0.0 0.0 0 0 ? D 06:39 0:00 [jbd2/dm-1-8]
root 1687 0.1 0.0 0 0 ? D 11:15 0:12 [kworker/u96:5]
root 13057 2.0 0.0 0 0 ? D 13:10 0:01 [dmcrypt_write]
root 13644 10.9 0.0 7452 …Run Code Online (Sandbox Code Playgroud) io ×10
hard-drive ×5
linux ×5
performance ×4
benchmark ×2
nfs ×2
bottleneck ×1
centos ×1
directory ×1
drbd ×1
ionice ×1
iowait ×1
measurement ×1
nice ×1
perfmon ×1
ssd ×1
windows-xp ×1