gpt4 book ai didi

c - linux 上多进程写入一条消息时性能较差

转载 作者:行者123 更新时间:2023-11-30 19:48:16 25 4
gpt4 key购买 nike

我编写一个测试程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/msg.h>
#include <time.h>


#define PACKET_SIZE 500
#define LOOP_COUNT 30000

int g_sndsucc = 0;
int g_sndfail = 0;

const int C_IPC_KEY = 0x00231a95;
const int COUNT_SIZE = 10000;

unsigned long g_count = 0;
unsigned long g_t1 = 0;
struct timeval s1, s2, s3, s4;


int main(int argc, char* argv[])
{
int ipckey = C_IPC_KEY;
if(argc > 1)
{
ipckey = atoi(argv[1]);
printf("ipckey is %d\n", ipckey);
}

int qid = msgget(ipckey, IPC_CREAT | 0666);
if(qid <= 0)
{
printf("msgget err: %d \n", errno);
return 0;
}

char data[PACKET_SIZE];
memset(data, 'a', PACKET_SIZE-1);
data[PACKET_SIZE-1] = '\0';
*((long *)data) = 0;

int ret = 0;
struct timeval start;
gettimeofday (&start, NULL);
while(1)
{
*((long *)data) +=1;
gettimeofday (&s1, NULL);
ret = msgsnd(qid, data, PACKET_SIZE,0);
gettimeofday (&s2, NULL);
if(ret != 0)
{
g_sndfail ++;
}
else
{
g_sndsucc ++;
}

g_count++;
g_t1 += (s2.tv_sec-s1.tv_sec)*1000000 + (s2.tv_usec-s1.tv_usec);

if ( g_count >= 10000)
{

printf("STAT1: t1 : %f\n",
10000000000.0 / g_t1);

g_count = 0;
g_t1 = 0;
}
usleep(1000);

}

return 0;
}

我为 msgsnd 创建了 100 个相同的进程,在 suse 上,每个进程的 msgsnd tps 仅达到 50/s。但在 AIX5 上,msgsnd tps 可以达到 10000/s。

有谁知道为什么linux上多进程时IPC的性能这么差?以及如何提高linux上的性能?

顺便说一句,suse的kenel版本是linux 3.0.13

最佳答案

我查了linux3.8中msgget的源码。

当线程没有获得msg锁时,不会释放cpu并休眠一段时间。相反,它会调用 ipc_lock_by_ptr(&msq->q_perm);频繁地。所以cpu占用率会很高,并且当线程增多时,碰撞率会迅速增长。

关于c - linux 上多进程写入一条消息时性能较差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com