~0 == -1

在c中,对一个数求反,并不是求这个数的反码。

假设int类型是16位,则sined int的范围是-32768 ~ 32767(-2^15 ~ 2^15 - 1),即:

1000 0000 0000 0000  ~  0111 1111 1111 1111

这个范围可分为3段:

负:1000 0000 0000 0000  ~  1111 1111 1111 1111 (-32768 ~ -1)

零:0000 0000 0000 0000

正:0000 0000 0000 0001  ~  0111 1111 1111 1111 (1 ~ 32767)

 

有人会对1111 1111 1111 1111 == -1 感到疑惑,在c中的sined和unsigned不同于机器中的正和负

在机器中总会存在符号位,并且符号位并不算在数的(绝对值)中。c中的sined和unsigned是对编译器

来说的,signed的符号位算在数的(绝对值)中,所以只能用1111 1111 1111 1111来表示-1,是由

1000 0000 0000 0000 + 0111 1111 1111 1111 (-32768 + 32767)得到的

 

1111 1111 1111 1111 == -1 (~0)

1111 1111 1111 1110 == -2 (~1)

1111 1111 1111 1101 == -3 (~2)

顺序写: fio --ioengine=libaio --direct=1 --norandommap --time_based --group_reporting --bs=128k --runtime=300 --ramp_time=30 --randrepeat=0 --log_avg_msec=1000 --name=test --rw=write --numjobs=1 --iodepth=128 --filename=/dev/nvme1n1 --output=bw_128k_bind_multi_write_nvme0n1.log 顺序读: fio --ioengine=libaio --direct=1 --norandommap --time_based --group_reporting --bs=128k --runtime=300 --ramp_time=30 --randrepeat=0 --log_avg_msec=1000 --name=test --rw=read --numjobs=1 --iodepth=128 --filename=/dev/nvme1n1 --output=bw_128k_bind_multi_write_nvme0n1.log 随机写: fio --ioengine=libaio --direct=1 --norandommap --time_based --group_reporting --bs=4k --runtime=300 --ramp_time=30 --randrepeat=0 --log_avg_msec=1000 --name=test --rw=randwrite --numjobs=16 --iodepth=128 --filename=/dev/nvme1n1 --output=bw_128k_bind_multi_randwrite_nvme0n1.log 随机读: fio --ioengine=libaio --direct=1 --norandommap --time_based --group_reporting --bs=4k --runtime=300 --ramp_time=30 --randrepeat=0 --log_avg_msec=1000 --name=test --rw=randread --numjobs=16 --iodepth=128 --filename=/dev/nvme1n1 --output=bw_128k_bind_multi_randread_nvme0n1.log 我的环境只有一张盘nvme0n1,并且OS也是安装在这张盘nvme0n1上的,如何跑上面的测试命令,不能破坏OS,安全的测试磁盘带宽,但是不影响原来命令的测试的目的和性能,给出新的命令 [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:0 0 7T 0 disk ├─nvme0n1p1 259:1 0 600M 0 part /boot/efi ├─nvme0n1p2 259:2 0 1G 0 part /boot └─nvme0n1p3 259:3 0 7T 0 part ├─opencloudos-root 251:0 0 70G 0 lvm / ├─opencloudos-swap 251:1 0 4G 0 lvm [SWAP] └─opencloudos-home 251:2 0 6.9T 0 lvm /home [root@localhost ~]#
最新发布
11-04
你的目标是使用 `fio` 测试 NVMe 磁盘(`/dev/nvme0n1`)的顺序读写和随机读写性能,但 **不能影响操作系统运行安全**(因为 OS 安装在该盘上),同时又要尽可能保持原有测试命令的参数设置(如 block size、iodepth、runtime 等),以保证测试结果的有效性。 --- ### ✅ 核心问题: 你当前的命令中指定了 `--filename=/dev/nvme1n1`,但实际设备是 `/dev/nvme0n1`。此外,直接对整个磁盘 `/dev/nvme0n1` 进行 I/O 操作会严重干扰系统运行,甚至导致崩溃或数据损坏。 --- ### ✅ 解决方案思路: 为了避免破坏系统,我们应该: 1. **不直接操作整个磁盘设备**(如 `/dev/nvme0n1`) 2. 使用一个**专用的大文件作为测试对象**,放在非关键路径下(如 `/home/fiotest.tmp`) 3. 文件大小足够大(比如 10G~100G),避免缓存影响 4. 设置 `overwrite=0` 或 `create_only=1` 来确保不会误删重要数据 5. 使用 `sync=0` 和 `direct=1` 绕过页缓存,模拟真实磁盘性能 6. 保留原命令中的关键参数:`bs`, `iodepth`, `numjobs`, `runtime` 等 --- ## ✅ 推荐修改后的 fio 命令(安全版) > 所有测试均基于一个预创建的大文件 `/home/fiotest.tmp`,不会影响系统分区 ```bash # 创建一个用于测试的大文件(例如 50GB) dd if=/dev/zero of=/home/fiotest.tmp bs=1M count=50000 status=progress ``` 然后使用以下四个修改后的命令进行测试: --- ### 🔹 1. 顺序写 (Sequential Write) ```bash fio --ioengine=libaio \ --direct=1 \ --norandommap \ --time_based \ --group_reporting \ --bs=128k \ --runtime=300 \ --ramp_time=30 \ --randrepeat=0 \ --log_avg_msec=1000 \ --name=test_seqwrite \ --rw=write \ --numjobs=1 \ --iodepth=128 \ --filename=/home/fiotest.tmp \ --size=50G \ --output=bw_128k_seq_write.log ``` --- ### 🔹 2. 顺序读 (Sequential Read) ```bash fio --ioengine=libaio \ --direct=1 \ --norandommap \ --time_based \ --group_reporting \ --bs=128k \ --runtime=300 \ --ramp_time=30 \ --randrepeat=0 \ --log_avg_msec=1000 \ --name=test_seqread \ --rw=read \ --numjobs=1 \ --iodepth=128 \ --filename=/home/fiotest.tmp \ --size=50G \ --output=bw_128k_seq_read.log ``` --- ### 🔹 3. 随机写 (Random Write) ```bash fio --ioengine=libaio \ --direct=1 \ --norandommap \ --time_based \ --group_reporting \ --bs=4k \ --runtime=300 \ --ramp_time=30 \ --randrepeat=0 \ --log_avg_msec=1000 \ --name=test_randwrite \ --rw=randwrite \ --numjobs=16 \ --iodepth=128 \ --filename=/home/fiotest.tmp \ --size=50G \ --output=bw_4k_rand_write.log ``` --- ### 🔹 4. 随机读 (Random Read) ```bash fio --ioengine=libaio \ --direct=1 \ --norandommap \ --time_based \ --group_reporting \ --bs=4k \ --runtime=300 \ --ramp_time=30 \ --randrepeat=0 \ --log_avg_msec=1000 \ --name=test_randread \ --rw=randread \ --numjobs=16 \ --iodepth=128 \ --filename=/home/fiotest.tmp \ --size=50G \ --output=bw_4k_rand_read.log ``` --- ## 📌 参数解释与安全性说明: | 参数 | 含义 | 安全性作用 | |------|------|-----------| | `--filename=/home/fiotest.tmp` | 使用普通文件而非裸设备 | 避免破坏系统分区 | | `--direct=1` | 绕过文件系统缓存,直写磁盘 | 更接近真实磁盘性能 | | `--size=50G` | 明确测试范围不超过文件大小 | 防止越界访问 | | `--norandommap` | 不重复访问已写块(尤其 randwrite 时) | 提高性能一致性 | | `--ramp_time=30` | 先预热30秒再记录数据 | 排除启动瞬态影响 | | `--time_based` | 按时间运行而非完成所有I/O | 控制测试总时长 | | `--log_avg_msec=1000` | 每秒输出一次带宽日志 | 可观察性能波动 | --- ## ⚠️ 注意事项: 1. **不要删除 `/home/fiotest.tmp` 在测试期间** 2. 测试完成后可选择保留或删除这个文件 ```bash rm /home/fiotest.tmp ``` 3. 若 `/home` 是独立 LVM 分区(你的是 6.9T),则即使写满也不会影响根目录 `/` 4. 建议在低负载时段运行测试,减少干扰 5. 可通过 `iostat -xmt 1` 实时监控磁盘利用率和延迟 --- ## ✅ 性能对比建议: 虽然不是裸盘测试,但使用大文件 + direct IO 的方式可以很好地逼近真实磁盘性能,尤其是对于评估 **持续吞吐量和 IOPS 能力** 来说非常有效。 如果你后续想更贴近“裸设备”性能,也可以考虑: - 创建一个未挂载的逻辑卷(LVM)专门用于测试 - 使用 `--filename=/dev/opencloudos/testlv` 这样的设备 但这需要额外配置,而上述文件方式是最简单且安全的折中方案。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值