-1

以下のようにテストプログラムを書きます。

#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 です。

4

1 に答える 1

0

linux3.8 の msgget のソースコードを確認しました。

スレッドが msg ロックを取得できなかった場合、スレッドは CPU を解放せず、しばらくスリープします。代わりに ipc_lock_by_ptr(&msq->q_perm); を呼び出します。頻繁に。そのため、CPU 使用率が非常に高くなり、スレッドが増加すると衝突率が急速に増加します。

于 2013-11-12T03:33:48.010 に答える