发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
在以前的博客中提到的一个服务端,在以前压力测试的过程中,发现单核CPU最多能达到1000TPS
还以为是服务端性能不够好,所以一直想着怎么去优化它。
但优化的思路明显不多,所以就考虑换一种压力测试的方法,事实证明这个想法是对的。
以前的压力测试方法 :
for((i=0;i<$3;i++));do for((j=0;j<$4;j++));do cmd="./client $1 $2 4 $a $a $a $a" echo `time $cmd` done& done
思路是用多进程来实现并发,代码如上所示;
现在的压力测试方法:
//客户端程序 /******* 客户端程序 client.c ************/ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <netdb.h> #include <netinet/in.h> #include <errno.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <sys/epoll.h> static struct sockaddr_in server_addr; static int epoll_fd; static int currency,total_req; static struct epoll_event* events; int setnonblock(int fd) { int flags; flags = fcntl(fd, F_GETFL); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); } void new_conn() { if(--total_req < 0)return; int sockfd; /* 客户程序开始建立 sockfd描述符 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket Error:%s\a\n",strerror(errno)); return ; } setnonblock(sockfd); //让epoll接管 struct epoll_event event; event.data.fd=sockfd; event.events = EPOLLOUT|EPOLLIN; epoll_ctl(epoll_fd,EPOLL_CTL_ADD, sockfd,&event); /* 客户程序发起连接请求 */ if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { if(errno == EINPROGRESS) return; fprintf(stderr,"Connect Error:%s\a\n",strerror(errno)); return; } } int main(int argc, char *argv[]) { struct hostent *host; if((host=gethostbyname(argv[1]))==NULL) { fprintf(stderr,"Gethostname error\n"); exit(1); } int portnumber,nbytes; if((portnumber=atoi(argv[2]))<0) { fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]); exit(1); } /* 客户程序填充服务端的资料 */ bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(portnumber); server_addr.sin_addr=*((struct in_addr *)host->h_addr); //并发数和总的请求数 currency = atoi(argv[3]); total_req = currency * atoi(argv[4]); if((epoll_fd=epoll_create(1000))==-1) { fprintf(stderr,"epoll create Error:%s\a\n",strerror(errno)); exit(1); } events = calloc(1000,sizeof(struct epoll_event)); //初始化并发数个连接 int i; for(i=0;i<currency;i++)new_conn(); while(1) { fprintf(stderr,"while\n"); int n,j; n = epoll_wait(epoll_fd, events, 1000, -1); for(j=0;j<n;j++) { if(events[j].events & EPOLLOUT) { fprintf(stderr, "can write\n",n); int fd = events[j].data.fd; int optval; socklen_t optlen = sizeof(optval); if(getsockopt(fd,SOL_SOCKET,SO_ERROR,&optval, &optlen) == -1) { fprintf(stderr, "getsockopt error\n",n); } else if(optval != 0) { fprintf(stderr, "connect error\n",n); continue; }; struct epoll_event event; event.data.fd=fd; event.events = EPOLLIN; epoll_ctl(epoll_fd,EPOLL_CTL_MOD, fd,&event); write(fd, "hello", strlen("hello")); } else if(events[j].events & EPOLLIN) { fprintf(stderr, "can read\n",n); int fd = events[j].data.fd; char buf[100]; int n=read(fd,buf,100); close(fd); new_conn(); if(n==-1) { fprintf(stderr,"read Error:%s\a\n",strerror(errno)); continue; } buf[n]=0; printf("return %s\n",buf); }else { fprintf(stderr, "can else\n",n); printf("%d %d %d %d %d %d %u\n",events[j].events, EPOLLIN, EPOLLOUT, EPOLLPRI,EPOLLERR, EPOLLHUP,EPOLLET); close(events[j].data.fd); } } } } 思路就是用单进程来测试,用EPOOL来实现并发代码也可下载:http://pan.baidu.com/s/1vdQqB性能对比:环境:单核CPU,两台机器,一台服务端,一台客户端多进程:690TPSEPOLL:6435TPS性能提高了十倍!分析:在单个机器上,使用多进程,资源消耗很大,不可能达到太大的并发而使用EPOLL,单进程同时监听多个socket,可以达到较高并发
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
Java
epoll 是Linux下,高效的多路复用技术,也是Linux下高性能网络服务器的关键技术。二、epoll提出原因。三、epoll原理。3.1 epoll监视多个...
压力测试衡量CPU的三个指标:CPU Utilization、Load Average和Context Switch Rate
压力测试衡量CPU的三个指标:CPU Utilization、Load Average和Context Switch RateCPU Utilization好理解,就是CPU的利用率,75%以上就比较高了(也有说法是80%或者更高)。后来发现了如下两片博文: ...
nginx和apache有什么区别?
nginx和apache有什么区别?抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 a...
MySQL的性能基线收集及压力测试
[root@mysql_node1 tpcc-mysql]# mysqladmin -uroot -p ''mypass'' -f create tpcc1000.[root@mysql_node1 tpcc-mysql]# mysql -uroot -pmypass -f tpcc1000 <create_table.sql.[r...
外卖聚合服务性能测试总结
测试环境搭建分硬件环境和软件环境,由于我们用的是阿里云服务,所以硬件环境无需搭建,软件环境建议画出大致的系统架构图,作为性能测...
转载 | 复杂度来源:高性能
复杂度来源:高性能高性能的系统采用的是哪种方式?虽然系统拆分可能在某种程度上能提升业务处理性能,但提升性能也是有限的。不可能系...
DeepMind最新力作:分布式强化学习框架Acme,智能体并行性加强
DeepMind最新力作:分布式强化学习框架Acme,智能体并行性加强选自DeepMind博客。近日,DeepMind 发布了一种新型分布式强化学习框架「Ac...
【原创】技术系列之 网络模型(二)
主线程的accept返回后,将clientfd放入预派生线程的线程消息队列,线程池读取线程消息队列处理clientfd。以上(1)(2)(3)(4)中都可以将业务线程(可以是线程池)独立,事先告之(1)、(2)、(3...
当我们在谈论高并发的时候究竟在谈什么?
由于CPU是串行的,因此对于单核CPU来说,同一时刻一定是只有一个线程在占用CPU资源的。现在就更容易解释了,进程和线程的切换,会产生CPU...
微信扫码,在手机上查看选中内容