在以前的博客中提到的一个服务端,在以前压力测试的过程中,发现单核CPU最多能达到1000TPS

还以为是服务端性能不够好,所以一直想着怎么去优化它。

但优化的思路明显不多,所以就考虑换一种压力测试的方法,事实证明这个想法是对的。

以前的压力测试方法 :

for((i=;i<$;i++));do

       for((j=;j<$;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,total_read;
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 < )return;
int sockfd;
/* 客户程序开始建立 sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,))==-)
{
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))==-)
{
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[]))==NULL)
{
fprintf(stderr,"Gethostname error\n");
exit();
} int portnumber;
if((portnumber=atoi(argv[]))<)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[]);
exit();
} /* 客户程序填充服务端的资料 */
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[]);
total_req = total_read = currency * atoi(argv[]); if((epoll_fd=epoll_create())==-)
{
fprintf(stderr,"epoll create Error:%s\a\n",strerror(errno));
exit();
} events = calloc(,sizeof(struct epoll_event)); //初始化并发数个连接
int i;
for(i=;i<currency;i++)new_conn(); while()
{
fprintf(stderr,"while\n");
int n,j;
n = epoll_wait(epoll_fd, events, , -);
for(j=;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) == -)
{
fprintf(stderr, "getsockopt error\n",n);
} else if(optval != ) {
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); char buffer2[];
memset(buffer2,,);
int type,score,time;
unsigned long oid;
type= htonl(atoi(argv[]));
oid= htonl(atol(argv[]));
score= htonl(atoi(argv[]));
char*pass="220106aa";
char*loc = buffer2;
memcpy((void*)loc,(void*)(pass),);
loc+=;
memcpy((void*)loc,(void*)(&type),);
loc+=;
memcpy((void*)loc,(void*)(&oid),);
loc+=;
memcpy((void*)loc,(void*)(&score),);
write(fd, buffer2, );
/* 连接成功了 */
}
else if(events[j].events & EPOLLIN)
{
fprintf(stderr, "can read\n",n);
int fd = events[j].data.fd;
char buf[];
int n=read(fd,buf,);
close(fd);
new_conn();
if(n==-)
{
fprintf(stderr,"read Error:%s\a\n",strerror(errno));
continue;
}
buf[n]=;
fprintf(stderr, "return %s\n",buf);
fprintf(stderr, "total_read %d\n",total_read);
if (--total_read <= )return;
}
}
}
}

思路就是用单进程来测试,用EPOOL来实现并发
代码也可下载:
百度网盘:http://pan.baidu.com/s/1vdQqB
github : https://github.com/hxdoit/real_time_rank/blob/master/server1-1.0/epoll.c

性能对比:
环境:单核CPU,两台机器,一台服务端,一台客户端
多进程:690TPS
EPOLL:6435TPS
性能提高了十倍!

分析:
在单个机器上,使用多进程,资源消耗很大,不可能达到太大的并发
而使用EPOLL,单进程同时监听多个socket,可以达到较高并发

用EPOLL进行压力测试的更多相关文章

  1. 对apache和memcache进行压力测试

    工作中经常使用的软件之二:apache和memcache 以前经常听说memcache的TPS能达到几万,但一直也不知道apache的性能到底如何,所以在闲暇之余,就自己做了一下压力测试. 环境:两台 ...

  2. 一次压力测试Bug排查-epoll使用避坑指南

    Bug复现 使用Webbench对服务器进行压力测试,创建1000个客户端,并发访问服务器10s,正常情况下有接近8万个HTTP请求访问服务器. 结果显示仅有7个请求被成功处理,0个请求处理失败,服务 ...

  3. DNS压力测试工具dnsperf简介

    dnsperf是我最近写的一个开源的DNS压力测试工具,用户可以用它来对DNS服务器或者Local DNS做压力测试.dnsperf目前的实现是单进程模式,通过epoll非阻塞地处理网络事件. dns ...

  4. 压力测试 php-fpm 优化

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装:引用wget http: ...

  5. Nginx配置性能优化与压力测试webbench【转】

    这一篇我们来说Nginx配置性能优化与压力测试webbench. 基本的 (优化过的)配置 我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.你应该能够在服务器的/et ...

  6. linux nginx常见问题及优化,压力测试,tomcat服务器优化

    nginx常见问题 nginx优化全局配置优化[root@web2 nginx]# vim conf/nginx.confuser nobody;worker_processes 1;(与cpu核心数 ...

  7. nginx优化php-fpm优化 压力测试达到每分150万访问量webbench网站压力

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装:引用wget http: ...

  8. 从零开始一个http服务器(六)-多路复用和压力测试

    从零开始一个http服务器(六)-多路复用和压力测试 代码地址 : https://github.com/flamedancer/cserver git checkout step6 运行: make ...

  9. JMeter工具接口性能压力测试分析与优化

    最近公司做的项目,要求对相关接口做性能压力测试,在这里记录一下分析解决过程. 压力测试过程中,如果因为资源使用瓶颈等问题引发最直接性能问题是业务交易响应时间偏大,TPS逐渐降低等.而问题定位分析通常情 ...

随机推荐

  1. Discuz模版与插件 安装时提示“对不起,您安装的不是正版应用...”解决方法

    关于出现“对不起,您安装的不是正版应用..”的解决办法 有些插件和风格在安装时出现不能安装的现象,出现以下提示:       对不起,您安装的不是正版应用,安装程序无法继续执行       点击这里安 ...

  2. SQLite入门与分析(二)---设计与概念(续)

    SQLite入门与分析(二)---设计与概念(续)   写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...

  3. 命令行添加用户的“作为服务登录”权利(添加Windows用户的时候,门道不是一般的多)good

    1.打开控制台(“开始”|“运行”中输入:MMC) 2.“文件”菜单|“添加删除管理单元”|“添加...”|选“安全模板”|“关闭”. 3.在“C:\Windows\Security\template ...

  4. inflate方法与findViewById的区别

    LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来找 re ...

  5. mysql的group by应用

    CREATE TABLE group_test (  id TINYINT(1) UNSIGNED NOT NULL, pubid TINYINT(1) UNSIGNED NOT NULL, user ...

  6. 50个非常有用的PHP工具

    PHP是使用最为广泛的开源服务器端脚本语言之一,当然PHP并不是速度最快的,但它却是最常用的脚本语言.这里有50个有益的PHP工具,可以大大提高你的编程工作: 调试工具 Webgrind Xdebug ...

  7. 制作计算器的代码(C#)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. [转] Android自动化测试之MonkeyRunner录制和回放脚本(四)

    测试脚本录制: 方案一: 我们先看看以下monkeyrecoder.py脚本: #Usage: monkeyrunner recorder.py #recorder.py  http://mirror ...

  9. Managed C++中使用Nullable<T>

    非null值表示和C#的用法一样. Nullable<int> a = 1; null值的表示: Nullable<int> a = Nullable<int>() ...

  10. Oracle Length 和 Lengthb 函数说明 .(用来判断记录值里是否有中文内容)

    一.官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e26088/functions088.htm#SQLRF00658 P ...