linux上多进程写一个msg时性能差

Posted

技术标签:

【中文标题】linux上多进程写一个msg时性能差【英文标题】:Poor performance when multi-processes write one msg on linux 【发布时间】:2013-10-30 02:02:50 【问题描述】:

我写一个测试程序如下:

#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

【问题讨论】:

【参考方案1】:

查看了linux3.8中msgget的源码

当线程没有得到msg锁的时候,不是释放cpu,而是休眠了一段时间。 相反,它将调用 ipc_lock_by_ptr(&msq->q_perm);频繁地。 所以cpu使用率会很高,而且随着线程的增加,冲突率会快速增长。

【讨论】:

以上是关于linux上多进程写一个msg时性能差的主要内容,如果未能解决你的问题,请参考以下文章

linux 消息队列进程通信问题,能发送消息,但接收时接收不到,停在那里等,请指导下

如何在python上多进程处理数据

如何在python上多进程处理数据

如何在python上多进程处理数据

linux负载均衡与性能监控

Linux高性能服务器编程:多进程编程