如何计算Linux中的磁盘读写延迟?
/proc是否可以使用文件系统进行计算?
我正在使用iostat和vmstat命令。但我不明白计算是如何进行的。
我用这段代码进行计算。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/sysinfo.h>
int main(int argc, char * * argv) {
struct sysinfo si;
sysinfo( & si);
const double xdt = 1024;
float pagein, pageout, oldvalin = 0, oldvalout = 0, res;
for (;;) {
FILE * fp = fopen("/proc/vmstat", "r");
char tmp[256];
char subbuff[256];
while (fp != NULL && fgets(tmp, sizeof(tmp), fp) != NULL) {
if (strstr(tmp, "pgpgin")) {
memcpy(subbuff, & tmp[7], 40);
subbuff[40] = …Run Code Online (Sandbox Code Playgroud) 我将 /dev/sda 安装在 / 上,作为根分区。我可以badblocks在此设备上安全地以只读模式运行吗?它会因为安装而显示误报/漏报吗?
我正在从磁盘中顺序读取一个大文件,并尝试iostat在读取过程中理解输出。
输出iostat如下
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 833.00 14.00 103.88 0.05 251.30 6.07 5.69 2.33 205.71 1.18 100.00
Run Code Online (Sandbox Code Playgroud)
计算 I/O 请求的平均大小 =(rMB/s 除以 r/s)得出 ~ 128 KB,这是预读值。这似乎表明,虽然 read 系统调用指定了 4KB 缓冲区,但实际磁盘 I/O 是根据预读值发生的。
当我将预读值增加到256KB时,iostat输出如下
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 28.00 412.00 12.00 102.50 0.05 …Run Code Online (Sandbox Code Playgroud) lsscsi告诉我我有许多磁盘和盘柜。
我可以用来$ ls /sys/class/enclosure/6:0:10:0/ArrayDevice*/device/scsi/disk获取 6:0:10:0 机箱下磁盘的所有 scsi 地址的列表。
我可以将该列表与lsscsi输出相关联,以查看每个磁盘的位置。
但我当然不需要编写脚本来自动执行此操作。udevadm有没有类似的工具sg_ses可以为我完成这项任务?
我想知道如何像在 Windows 任务管理器中一样检查 Linux 中的磁盘使用情况。
我的意思是,我不想知道分区上有多少可用空间或类似的东西,我想知道在给定时刻磁盘使用了多少。
这是一个 gif:https://i.gyazo.com/4a91e7ed2e519d6fe628811d7c03d6c3.gif
当我打开程序时,它使用得更多。
我有一篇文章:如何复制旧磁盘数据\xef\xbc\x9f
\n\n答案很好,但对我没有帮助。答案用户建议我在那里开一个新帖子,因为这是一些区别。
\n\n我尝试使用扫描系统查找我的旧卷组vgscan,但它找不到我的旧卷组。
我也曾经lvmdiskscan寻找过我的旧物理卷,不幸的是,lvmdiskscan找不到它。以下是输出lvmdiskscan:
[root@localhost mapper]# lvmdiskscan\n /dev/ram0 [ 16.00 MiB] \n /dev/loop0 [ 930.53 GiB] \n /dev/root [ 50.00 GiB] \n /dev/ram1 [ 16.00 MiB] \n /dev/sda1 [ 500.00 MiB] \n /dev/VolGroup/lv_swap [ 7.05 GiB] \n /dev/ram2 [ 16.00 MiB] \n /dev/sda2 [ 931.02 GiB] \n /dev/VolGroup/lv_home [ 873.97 GiB] \n /dev/ram3 [ 16.00 MiB] \n /dev/ram4 [ 16.00 MiB] \n /dev/ram5 [ 16.00 MiB] \n …Run Code Online (Sandbox Code Playgroud) 我的工作负载在短时间内具有极高的写入突发率。目标磁盘相当慢,但我有足够的 RAM 并且非常能容忍瞬时数据丢失。
我尝试调整 vm.dirty_ratio 以最大限度地利用用于脏页的可用 RAM 空间。
# free -g
total used free shared buff/cache available
Mem: 251 7 213 3 30 239
Swap: 0 0 0
# sysctl -a | grep -i dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 5
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 90000
vm.dirty_ratio = 90
Run Code Online (Sandbox Code Playgroud)
但是,我似乎仍然遇到一些基于底层磁盘速度的写回限制。我怎样才能禁用这个功能?
# dd if=/dev/zero of=/home/me/foo.txt bs=4K count=100000 oflag=nonblock
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 10.2175 s, 40.1 MB/s
Run Code Online (Sandbox Code Playgroud)
只要有空闲内存并且脏率尚未超过 - 我想全速写入页面缓存。
我们在 sdb 磁盘上运行 smartctl
smartctl -a /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-327.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
Smartctl open device: /dev/sdb failed: DELL or MegaRaid controller, please try adding '-d megaraid,N'
Run Code Online (Sandbox Code Playgroud)
根据 smartctl 的输出,我们将其更改为
smartctl -a -d megaraid,0 /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-327.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Vendor: TOSHIBA
Product: MG04SCA20ENY
.
.
Run Code Online (Sandbox Code Playgroud)
我根据第一条总线设置 - 0 (来自 smartctl --scan )
smartctl --scan …Run Code Online (Sandbox Code Playgroud) 我在 Windows 主机上的虚拟机 (VMWare) 中运行 Ubuntu 18.04.1。我正在尝试使用 dd 将整个 SD 卡清零。这是我用来向软件组发布嵌入式 Linux 的过程的一部分(当空 FS 数据全为 0 时,SD 卡映像压缩得更好)。
我正在使用的命令是:sudo dd if=/dev/zero of=/dev/sdc bs=4M status=progress并且它成功完成;我收到传输记录的打印输出,以及一条消息,指出设备上没有剩余空间。如果我随后查看sudo cat /dev/sdc | hexdump磁盘内容,磁盘仍然充满数据并且不是零(不仅仅是在末尾)。
我是否必须指定 SD 卡的字节数才能使其一致工作?我每次将 SD 卡清零时都不会出现此问题。
完整的控制台输出:
gen-ccm-root@ubuntu:~$ sudo dd if=/dev/zero of=/dev/sdc bs=4M status=progress
15929966592 bytes (16 GB, 15 GiB) copied, 1274 s, 12.5 MB/s
dd: error writing '/dev/sdc': No space left on device
3799+0 records in
3798+0 records out
15931539456 bytes (16 GB, 15 GiB) copied, 1274.19 s, …Run Code Online (Sandbox Code Playgroud) 我想减少磁盘上 ext4 分区的大小,并且想知道我的文件在操作过程中是否可能损坏?我了解到 ext4 文件系统对每个文件使用大范围,因此文件是否可能位于分区末尾并在此过程中损坏/删除?