小编seb*_*hat的帖子

在最大尺寸之前写入命名管道块

我尝试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)

c linux pipe

8
推荐指数
1
解决办法
368
查看次数

实时Linux:禁用本地计时器中断

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)

real-time timer interrupt scheduler linux-kernel

5
推荐指数
1
解决办法
2605
查看次数

当另一个进程共享相同的HT内核时,为什么一个进程的执行时间更短

我有一个带有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)

linux performance x86 intel hyperthreading

4
推荐指数
1
解决办法
125
查看次数