我尝试mkfifo /tmp/pipe通过一次写入3个字节来填充命名管道(由其创建),直到write()功能块为止.
在我的系统上,管道似乎限制为16页4096字节.因此管道可以包含65536个字节.
我使用以下C代码执行此操作:
int main ()
{
pid_t child;
child = fork ();
if (child == 0)
{
ssize_t ret;
ssize_t total = 0;
unsigned char *datat = malloc (65536);
assert (datat != NULL);
int fd = open ("/tmp/pipe", O_WRONLY);
assert (fd != -1);
while (1)
{
printf ("Trying writting\n");
ret = write (fd, datat, 3);
assert (ret != -1);
total += ret;
printf ("write : %ld.\n", total);
}
}
else
{
int fd = …Run Code Online (Sandbox Code Playgroud) TL; DR:将Linux内核实时与NO_HZ_FULL一起使用,我需要隔离一个进程才能获得确定的结果,但是/ proc / interrupts告诉我仍然存在本地计时器中断(以及其他中断)。如何禁用它?
长版:
我想确保我的程序没有被中断,所以我尝试使用实时Linux内核。我使用的是Arch Linux的实时版本(AUR上的linux-rt),并且修改了内核的配置,以选择以下选项:
CONFIG_NO_HZ_FULL=y
CONFIG_NO_HZ_FULL_ALL=y
CONFIG_RCU_NOCB_CPU=y
CONFIG_RCU_NOCB_CPU_ALL=y
Run Code Online (Sandbox Code Playgroud)
然后我重新启动计算机,以使用以下选项在此实时内核上启动:
nmi_watchdog=0
rcu_nocbs=1
nohz_full=1
isolcpus=1
Run Code Online (Sandbox Code Playgroud)
我还禁用了BIOS中的以下选项:
C state
intel speed step
turbo mode
VTx
VTd
hyperthreading
Run Code Online (Sandbox Code Playgroud)
我的CPU(i7-6700 3.40GHz)具有4个内核(具有超线程技术的8个逻辑CPU),在/ proc / interrupts文件中可以看到CPU0,CPU1,CPU2,CPU3。
CPU1由isolcpus内核参数隔离,我想在此CPU上禁用本地计时器中断。尽管具有CONFIG_NO_HZ_FULL和CPU隔离(isolcpus)的实时内核足以做到这一点,但我尝试通过运行以下命令进行检查:
cat /proc/interrupts | grep LOC > ~/tmp/log/overload_cpu1
taskset -c 1 ./overload
cat /proc/interrupts | grep LOC >> ~/tmp/log/overload_cpu1
Run Code Online (Sandbox Code Playgroud)
过载过程在哪里:
***overload.c:***
int main()
{
for(int i=0;i<100;++i)
for(int j=0;j<100000000;++j);
}
Run Code Online (Sandbox Code Playgroud)
该文件overload_cpu1包含结果:
LOC: 234328 488 12091 11299 Local timer interrupts
LOC: 239072 651 12215 …Run Code Online (Sandbox Code Playgroud) 我有一个带有4个HT内核(8个逻辑CPU)的Intel CPU,并构建了两个简单的进程。
第一个:
int main()
{
for(int i=0;i<1000000;++i)
for(int j=0;j<100000;++j);
}
Run Code Online (Sandbox Code Playgroud)
第二个:
int main()
{
while(1);
}
Run Code Online (Sandbox Code Playgroud)
两者都编译时gcc没有特殊选项。(即默认值为-O0:无优化调试模式,将变量保留在内存中而不是寄存器中。)
当我在第一个逻辑CPU(CPU0)上运行第一个时,并且当其他逻辑CPU的负载费用接近0%时,此第一个进程的执行时间为:
real 2m42,625s
user 2m42,485s
sys 0m0,070s
Run Code Online (Sandbox Code Playgroud)
但是,当我在CPU4上运行第二个进程(无限循环)时(CPU0和CPU4在同一内核上,但不在同一硬件线程上),第一个进程的执行时间为
real 2m25,412s
user 2m25,291s
sys 0m0,047s
Run Code Online (Sandbox Code Playgroud)
我期望更长的时间,因为在同一核心上有两个进程,而不是只有一个。但这实际上更快。为什么会这样?
编辑:P状态驱动程序是intel_pstate。使用来固定C状态processor.max_cstate=1 intel_idle.max_cstate=0。将调速器设置为性能(cpupower frequency-set -g performance),禁用涡轮增压(cat /sys/devices/system/cpu/intel_pstate/no_turbo给出1)