Linux 在Perl中使用修改的调度优先级运行OS函数
有没有可能让Perl在没有外部命令的情况下以修改的调度和/或IO调度优先级运行Linux OS函数?我试图模拟以下情况:Linux 在Perl中使用修改的调度优先级运行OS函数,linux,perl,Linux,Perl,有没有可能让Perl在没有外部命令的情况下以修改的调度和/或IO调度优先级运行Linux OS函数?我试图模拟以下情况: nice -n19 ionice -c2 -n7 cp largefile largefile2 我可以用File::Copy、setpriority函数和CPAN模块Linux::IO_Prio来实现这一点吗?我是否需要降低调度优先级$0 编辑: 如果执行以下操作,copy()的优先级和IO是否会降低?有更好的方法吗 use Linux::IO_Prio qw(:all)
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: $!";
您最好只是根据需要更改当前运行的pid的优先级。当然不可移植,但这样做本身就是不可移植的。执行这类操作的任何操作都将归结为进行与外部命令相同的库调用
my $pid = $$;
`ionice -c2 -p$pid`;
`renice +19 $pid`;
精炼:
顺便说一下,您可以使用strace
查找库调用和类似的内容
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
);