对于快速基准测试,如何将nice和ionice结合起来以达到最大效果,即命令使用尽可能少的资源(完全不空闲)?
(我认为它类似于`nice -n 19 ionice -c 2 [command],但不确定 ionice 的“-n”(classdata param),手册页对其相关性很神秘。)
答案1
您想要的完整命令是:
chrt -b 0 nice -n 19 ionice -c 2 -n 7 [command]
最开始的命令chrt
会把事情切换到批量调度类,相当于nice值加0.5。 ionice 的 -n 选项是实时 ( -c 1
) 和尽力而为 ( -c 2
) 选项的简单优先级,值越低优先级越高,就像好的值一样(但在 0-7 范围内)。然而, ionice 命令并不是绝对必要的,因为 I/O 调度类和优先级默认是从 CPU 调度参数派生的,并且nice -n 19
意味着ionice -c 2 -n 7
。
但是,您可以通过将 CPU 和 I/O 调度类设置为空闲来获得绝对最小的资源使用量。在这两种情况下,“空闲”调度程序实际上并不是空闲调度程序,您仍然可以使用资源,只是所有内容都将具有更高的优先级。
对于 CPU 调度类,这也使用命令chrt
,尽管不需要nice
(优先级必须在空闲调度类中设置0
),如下所示:
chrt -i 0 {command or PID}
Linux 上的命令nice
镜像了 SVR4 版本,这意味着它不能更改调度类,只能更改好值(在 Linux 上的行为也与经典 UNIX 不同,但这有点 OT)。由于最初的替代调度类是 POSIX.1E realtime ,SCHED_RR
因此SCHED_FIFO
最终调用了设置调度类的命令chrt
。该-i
选项指定使用SCHED_IDLE
调度类
对于 I/O 调度类,您使用ionice
.确切的命令如下所示:
ionice -c 3 {command or PID}
该-c
选项指定使用什么调度类,3 是空闲类的编号。请注意,根据所使用的块 I/O 调度程序,这实际上可能不会产生任何影响。特别是,noop
I/O 调度程序根本不支持优先级或调度类,而且我很确定deadline
调度程序(包括传统调度程序和 blk-mq 调度程序)也不支持。
如果您想以编程方式执行此操作,无论是为您自己的程序还是为其他进程调整内容,请查看sched_setscheduler
和ioprio_set
系统调用的手册页(尽管如果您也只是想要更多背景知识,则两者都值得阅读)。