https://github.com/Rtoax/test/blob/master/ipc/mqueue/1/statistics-perf.c

/***  统计 mqueue 消息队列的吞吐率和性能*  作者:荣涛  *  日期  :2021年1月4日*  修改历史*      2021年1月5日 添加时间戳,计算时延*/
#include <stdio.h>
#include <fcntl.h>           /* For O_* constants */
#include <sys/stat.h>        /* For mode constants */
#include <mqueue.h>
#include <sys/msg.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>/*在虚拟机中测得结果为:[root@localhost 1]# gcc statistics-perf.c  -pthread -lrt -DTEST_SIZE=1500 -DTEST_NLOOP=100000
[root@localhost 1]# ./a.out Message Queue - Client key is: 2064646621TX rate 7628.327 Mbits/secLatency Per Message = 0.063252 msRX rate 7628.174 Mbits/secTX rate 6587.400 Mbits/secLatency Per Message = 0.010186 msRX rate 6588.272 Mbits/sec
*/#ifndef TEST_SIZE
#define TEST_SIZE   1024
#endif
#ifndef TEST_NLOOP
#define TEST_NLOOP   10240
#endif#define MQUEUE_NAME "/_rtoax_mq_"
//#define MSG_FILE "./_rtoax_msgq_"
#define MSG_FILE "./a"#define MQUEUE_MAX_SIZE TEST_SIZE
#define MQUEUE_MAX_MSG 256#define MSGQ_TYPE   888#ifndef offsetof
#define offsetof(type, number) __builtin_offsetof(type, number)
#endifstruct dbg_msg {unsigned long msg_seq;unsigned long msg_ack;unsigned long msg_len;
#ifdef CRCunsigned int crc32;
#endif
#ifndef NOTIMESTAMPunsigned long timestamp;
#endifchar data[];
};pthread_t task1, task2;
mqd_t mqd;
int msqid;static struct cpu_freq {enum {CPU_3GMHZ, CPU_2_7GMHZ,}index;unsigned long freq;char *string;
}CPU_MHZ[] = {{CPU_3GMHZ, 3000000000, "3GMHz"},{CPU_2_7GMHZ, 2700000000, "2.7GMHz"},
};static unsigned int crc32(unsigned char const *p, unsigned int len)
{int i;unsigned int crc = 0;#ifdef CRCwhile (len--) {crc ^= *p++;for (i = 0; i < 8; i++)crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);}
#endifreturn crc;
}unsigned long __get_ticks(void)
{unsigned long ret;union{unsigned long tsc_64;struct{unsigned int lo_32;unsigned int hi_32;};} tsc;__asm volatile("rdtsc" :"=a" (tsc.lo_32),"=d" (tsc.hi_32));ret = ((unsigned long)tsc.tsc_64);return ret;
}inline void set_msg_timestamp(struct dbg_msg*msg)
{
#ifndef NOTIMESTAMPmsg->timestamp = __get_ticks();
#endif
}
inline unsigned long call_timestamp_diff(struct dbg_msg*msg)
{
#ifndef NOTIMESTAMPreturn __get_ticks() - msg->timestamp;
#elsereturn 0;
#endif
}static unsigned long int diff_timeval_usec(struct timeval *big, struct timeval *small)
{unsigned long int diffsec = big->tv_sec - small->tv_sec;unsigned long int diffusec = diffsec*1000000 + (big->tv_usec - small->tv_usec);
//    printf("%ld MicroSec\n", diffusec);return diffusec;
}typedef ssize_t (*recv_hook_fn)(void *msg_ptr, size_t msg_len);
typedef int (*send_hook_fn)(void *msg_ptr, size_t msg_len);ssize_t __hook_mq_receive(void *msg_ptr, size_t msg_len)
{return mq_receive(mqd, msg_ptr, msg_len, 0);
}
ssize_t __hook_msgrcv(void *msg_ptr, size_t msg_len)
{return msgrcv(msqid, msg_ptr, msg_len, MSGQ_TYPE, 0);
}int __hook_mq_send(void *msg_ptr, size_t msg_len)
{return mq_send(mqd, (char*)msg_ptr, msg_len, 0);
}
int __hook_msgsnd(void *msg_ptr, size_t msg_len)
{return msgsnd(msqid, msg_ptr, msg_len, 0);
}void printf_rate(const char *prefix, unsigned long bytes, unsigned long microsec)
{printf("%s rate %.3lf Mbits/sec\n", prefix, bytes*8.0/1024/1024*1000000/microsec);}void test_mqueue_send(send_hook_fn send_fn)
{int ret;ssize_t n;char send_buffer[MQUEUE_MAX_SIZE] ={'A'};char recv_buffer[MQUEUE_MAX_SIZE] ={'A'};struct dbg_msg *send_pdmsg = (struct dbg_msg *)&send_buffer;struct timespec timeout = {2,0};unsigned long nloop = 0;struct timeval start, end;unsigned long send_bytes = 0;memset(send_buffer, 'A', sizeof(send_buffer));send_pdmsg->msg_seq = MSGQ_TYPE;send_pdmsg->msg_ack = 0;send_pdmsg->msg_len = sizeof(send_buffer);
#ifdef CRCsend_pdmsg->crc32 = crc32(send_pdmsg->data, send_pdmsg->msg_len-offsetof(struct dbg_msg, data));
#endifgettimeofday(&start, NULL);while(++nloop <= TEST_NLOOP) {set_msg_timestamp(send_pdmsg);ret = send_fn((char*)send_pdmsg, send_pdmsg->msg_len);if(ret != 0) {continue;} else {send_bytes += send_pdmsg->msg_len;send_pdmsg->msg_ack++;}}gettimeofday(&end, NULL);printf_rate("TX", send_bytes, diff_timeval_usec(&end, &start));}void *task1_fn(void*arg)
{test_mqueue_send(__hook_mq_send);test_mqueue_send(__hook_msgsnd);pthread_exit(NULL);
}void test_mqueue_recv(recv_hook_fn recv_fn)
{int ret;ssize_t n;char buffer[MQUEUE_MAX_SIZE] ={0};struct dbg_msg *pdmsg;unsigned long nloop = 0;struct timeval start, end;unsigned long recv_bytes = 0;unsigned long ticks_total = 0;gettimeofday(&start, NULL);while(++nloop <= TEST_NLOOP) {n = recv_fn(buffer, MQUEUE_MAX_SIZE);if(n <= 0) {continue;} else {recv_bytes += n;pdmsg = (struct dbg_msg*)buffer;ticks_total += call_timestamp_diff(pdmsg);
//            printf("T2(%d/%ld): recv seq(%ld), ack(%ld), len(%ld)\n", \
//                        n, recv_bytes, pdmsg->msg_seq, pdmsg->msg_ack, pdmsg->msg_len);
#ifdef CRCif(pdmsg->crc32 != crc32(pdmsg->data, pdmsg->msg_len-offsetof(struct dbg_msg, data))) {printf("crc32 error: %x vs %x\n", pdmsg->crc32, crc32(pdmsg->data, pdmsg->msg_len-offsetof(struct dbg_msg, data)));}
#endif            pdmsg->msg_ack++;}}gettimeofday(&end, NULL);printf("Latency Per Message = %lf ms\n", ticks_total*1.0/(nloop-1)/CPU_MHZ[CPU_2_7GMHZ].freq*1000.0);printf_rate("RX", recv_bytes, diff_timeval_usec(&end, &start));}void *task2_fn(void*arg)
{test_mqueue_recv(__hook_mq_receive);test_mqueue_recv(__hook_msgrcv);pthread_exit(NULL);
}void msgq_init()
{key_t key;/*获取key值*/if((key = ftok(MSG_FILE, 123)) < 0){perror("ftok error");exit(1);}/*打印key值*/printf("Message Queue - Client key is: %d\n", key);/*打印队列消息*/if((msqid = msgget(key, IPC_CREAT|0777)) == -1){perror("msgget error");exit(1);}
}void unix_sock_init()
{}void mqueue_init()
{int ret;struct mq_attr attr;ret = mq_unlink(MQUEUE_NAME);attr.mq_flags = 0;attr.mq_msgsize = MQUEUE_MAX_SIZE;attr.mq_maxmsg = MQUEUE_MAX_MSG;mqd = mq_open(MQUEUE_NAME, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO, &attr);
//    printf("Init mqeue, mqd =  %d, %s\n", mqd, strerror(errno));}void task_init()
{pthread_create(&task1, NULL, task1_fn, NULL);pthread_create(&task2, NULL, task2_fn, NULL);
}void task_join()
{pthread_join(task1, NULL);pthread_join(task2, NULL);
}int main()
{mqueue_init();msgq_init();unix_sock_init();task_init();task_join();
}

测试POSIX、System V消息队列时延和性能相关推荐

  1. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  2. System V 消息队列

    一.System V 消息队列 有一个队列,队列存放各种消息.每个进程可以把数据封存在消息中,再放入队列.每个进程都可以拿到消息队列,再从中取出/放入消息. 消息队列也有管道一样的不足,就是每个消息的 ...

  3. System V消息队列

    简介 这篇笔记中介绍了消息队列的基本知识和Posix消息队列.这篇笔记主要学习记录System V消息队列,并对比两个消息队列. System V消息队列是更早的一个消息队列的实现.Posix消息队列 ...

  4. System V 消息队列概念以及相关函数(msgget、msgsnd、msgrcv、msgctl)介绍

    System V 消息队列 消息队列是半双工的通信方式 1.1 创建一个消息队列 消息队列的特点:消息只能一条的读取,不能多读取,也不能少读取,每条消息有一个类型,可以按照消息的类型读取 创建或者打开 ...

  5. (P26)system v消息队列:msgsnd函数 ,msgrcv函数

    文章目录 1.msgsnd函数 2.msgrcv函数 1.msgsnd函数 功能:把一条消息添加到消息队列中原型:int msgsnd(int msqid, const void *msgp, siz ...

  6. 06.System V 消息队列

    1.概述 System V消息队列使用消息队列标识符(message queue identifier)标识.具有足够特权的任何进程都可以往一个给定队列放置一个消息,具有足够特权的任何进程都可以从一个 ...

  7. system V消息队列的使用

    最近在学习网络,主要是<UNIX网络编程>这本书,现在给大家分享以下我在学习消息队列这一部分的心得和体会,如果有不足之处希望大家批评指正. 大家知道linux中支持Posix消息队列和Sy ...

  8. 细说linux IPC(十):system V 消息队列

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] system V消息队列和posix消息队列类 ...

  9. linux进程间通信:system V消息队列

    文章目录 基本介绍 编程接口 代码实例 消息队列的发送和接收 消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用 ...

最新文章

  1. EEPW单片机C语言程序设计,基于CH340T的STC89C52RC编程器设计
  2. 人脸检测识别文献阅读总结
  3. C#内存泄露与资源释放 经验总结
  4. python 常用镜像
  5. 团队开发——冲刺1.d
  6. python使用python-docx导出word
  7. 要不要买保险,看这篇就够了
  8. wps合并所有sheet页_别找了,你要的Excel多表合并都在这里了
  9. webpack 4 入门教程一
  10. 20190602:JDBC的增删改操作实践
  11. mysql可视化工具有哪些_有哪些用过一次就爱上的可视化工具?
  12. 《专家系统破解篇 六、IL代码破解--配套乱说》之 FeatherskyExpertSystem
  13. html 页面加载完成后执行,js中页面加载完成后执行的几种方法及执行顺序
  14. 已解决-Windows10没有windows照片查看器-Windows10打开照片是黑底的
  15. VBS教程--摘自百度百科
  16. android修改渠道,Android 多渠道定制化打包
  17. 对混淆矩阵、F1-Score
  18. Redis详解-更新中
  19. 电气器件系列三十二:电缸
  20. 18-25岁女性7成是大叔控 广东剩男比剩女多165万

热门文章

  1. stm32f103r8t6的晶振频率_STM32F103R8T6[1]
  2. deepin安装zsh以及简单配置
  3. 【vue项目使用echarts实现区域地图绘制,且可点击单独区域】
  4. 九种设计模式在Spring中的应用
  5. Linux centos7 安装python3.6.5 和 pip3
  6. 跟我学ASP.NET MVC之五:SportsStrore开始
  7. Linux(3)--防火墙
  8. 【C++11】新特性——auto的使用
  9. shell实现https登录
  10. C#仿QQ皮肤-ContextMenuStrip 控件实现