使用Perl修改调度优先级运行操作系统功能

4

在不使用外部命令的情况下,能否让Perl运行Linux操作系统函数并修改其调度和/或IO调度优先级? 我正在尝试模拟以下情况:

nice -n19 ionice -c2 -n7 cp largefile largefile2

我能否使用File::Copy、setpriority函数和CPAN模块Linux::IO_Prio来实现这个功能?我只需要降低$0的调度优先级吗?

编辑: 如果我执行以下操作,copy()的优先级和IO是否会降低?有更好的方法吗?

use Linux::IO_Prio qw(:all);
use File::Copy;

setpriority(0, 0, -20);
ionice(IOPRIO_WHO_PROCESS, $$, IOPRIO_CLASS_IDLE, 7);

copy("file1","file2") or die "Copy failed: $!";
2个回答

1

你最好只是根据需要更改当前运行的进程ID的优先级。当然,这并不具有可移植性,但做这件事本身就是非可移植的。任何执行此类操作的内容都将归结为执行与外部命令相同的库调用。

my $pid = $$;
`ionice -c2 -p$pid`;
`renice +19 $pid`;

1

Oesor的回答进行精炼:

use BSD::Resource qw(PRIO_PROCESS setpriority);
use Linux::IO_Prio qw(IOPRIO_WHO_PROCESS IOPRIO_PRIO_VALUE IOPRIO_CLASS_BE ioprio_set);
BEGIN { require autodie::hints; autodie::hints->set_hints_for(\&ioprio_set, { fail => sub { $_[0] == -1 } } ) };
use autodie qw(:all setpriority ioprio_set);

setpriority(
    PRIO_PROCESS,       # 1
    $$,
    19
);
ioprio_set(
    IOPRIO_WHO_PROCESS,                         # 1
    $$,
    IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 7)       # 0x4007
);

顺便说一下,你可以使用strace来查找库调用和类似的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接