首页 > 编程语言 >一个基于epoll的服务器压力测试的小程序

一个基于epoll的服务器压力测试的小程序

时间:2023-05-26 15:32:54浏览次数:24  
标签:epoll int bytes write fd 测试 服务器 include event


#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/epoll.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

static const char* request = "POST http://172.19.180.166/fcgi-bin/rs HTTP/1.1\r\n";

int setnonblocking( int fd )
{
    int old_option = fcntl( fd, F_GETFL );
    int new_option = old_option | O_NONBLOCK;
    fcntl( fd, F_SETFL, new_option );
    return old_option;
}

void addfd( int epoll_fd, int fd )
{
    epoll_event event;
    event.data.fd = fd;
    event.events = EPOLLOUT | EPOLLET | EPOLLERR;
    epoll_ctl( epoll_fd, EPOLL_CTL_ADD, fd, &event );
    setnonblocking( fd );
}

bool write_nbytes( int sockfd, const char* buffer, int len )
{
    int bytes_write = 0;
    printf( "write out %d bytes to socket %d\n", len, sockfd );
    while( 1 ) 
    {   
        bytes_write = send( sockfd, buffer, len, 0 );
        if ( bytes_write == -1 )
        {   
            return false;
        }   
        else if ( bytes_write == 0 ) 
        {   
            return false;
        }   

        len -= bytes_write;
        buffer = buffer + bytes_write;
        if ( len <= 0 ) 
        {   
            return true;
        }   
    }   
}

bool read_once( int sockfd, char* buffer, int len )
{
    int bytes_read = 0;
    memset( buffer, '\0', len );
    bytes_read = recv( sockfd, buffer, len, 0 );
    if ( bytes_read == -1 )
    {
        return false;
    }
    else if ( bytes_read == 0 )
    {
        return false;
    }
	printf( "read in %d bytes from socket %d with content: %s\n", bytes_read, sockfd, buffer );

    return true;
}

void start_conn( int epoll_fd, int num, const char* ip, int port )
{
    int ret = 0;
    struct sockaddr_in address;
    bzero( &address, sizeof( address ) );
    address.sin_family = AF_INET;
    inet_pton( AF_INET, ip, &address.sin_addr );
    address.sin_port = htons( port );

    for ( int i = 0; i < num; ++i )
    {
        sleep( 1 );
        int sockfd = socket( PF_INET, SOCK_STREAM, 0 );
        printf( "create 1 sock\n" );
        if( sockfd < 0 )
        {
            continue;
        }

        if (  connect( sockfd, ( struct sockaddr* )&address, sizeof( address ) ) == 0  )
        {
            printf( "build connection %d\n", i );
            addfd( epoll_fd, sockfd );
        }
    }
}

void close_conn( int epoll_fd, int sockfd )
{
    epoll_ctl( epoll_fd, EPOLL_CTL_DEL, sockfd, 0 );
    close( sockfd );
}

int main( int argc, char* argv[] )
{
    assert( argc == 4 );
    int epoll_fd = epoll_create( 100 );
    start_conn( epoll_fd, atoi( argv[ 3 ] ), argv[1], atoi( argv[2] ) );
    epoll_event events[ 10000 ];
    char buffer[ 2048 ];
    while ( 1 )
    {
        int fds = epoll_wait( epoll_fd, events, 10000, 2000 );
        for ( int i = 0; i < fds; i++ )
        {   
            int sockfd = events[i].data.fd;
            if ( events[i].events & EPOLLIN )
            {   
                if ( ! read_once( sockfd, buffer, 2048 ) )
                {
                    close_conn( epoll_fd, sockfd );
                }
                struct epoll_event event;
                event.events = EPOLLOUT | EPOLLET | EPOLLERR;
                event.data.fd = sockfd;
                epoll_ctl( epoll_fd, EPOLL_CTL_MOD, sockfd, &event );
            }
            else if( events[i].events & EPOLLOUT ) 
            {
                if ( ! write_nbytes( sockfd, request, strlen( request ) ) )
                {
                    close_conn( epoll_fd, sockfd );
                }
                struct epoll_event event;
                event.events = EPOLLIN | EPOLLET | EPOLLERR;
                event.data.fd = sockfd;
                epoll_ctl( epoll_fd, EPOLL_CTL_MOD, sockfd, &event );
            }
            else if( events[i].events & EPOLLERR )
            {
                close_conn( epoll_fd, sockfd );
            }
        }
    }
}



标签:epoll,int,bytes,write,fd,测试,服务器,include,event
From: https://blog.51cto.com/u_16131207/6356836

相关文章

  • 使用JMeter进行一次简单的带json数据的post请求测试,json可配置参数
    配置:1、新建一个线程组:然后设置线程数、运行时间、重复次数。2、新建Http请求:设置服务器域名,路径,方法,编码格式,数据内容。可以在函数助手中,编辑所需要的变量,比如本例中的随机生成电话号码。3、添加HTTP信息头管理器然后信息头添加一条名称为Content-Type,值为application/json即可......
  • 有关素数的基础算法 素性测试 埃氏筛法
    所谓素数,是指恰好有两个约数的正整数。因为n的约数都小于n,所以只需要检查2~ n-1之间所有的整数是否整除n就能判定n是不是素数。如果d是n的约数,那么n/d也是n的约数。由n=d*n/d可知min(d,n/d)  ,所以只需要检查2~ 之间的所有整数就足够了。同理可知,整数分解和约数枚举都......
  • 同步Linux服务器时间
    0012***/usr/sbin/ntpdate172.17.14.50 https://www.jianshu.com/p/542439e7feb4https://www.cnblogs.com/pipci/p/12844550.html 二、不同机器之间的时间同步为了避免主机时间因为长期运行下所导致的时间偏差,进行时间同步(synchronize)的工作是非常必要的。Linux系统......
  • JMeter04-性能测试流程之准备步骤
    性能测试流程性能需求分析测试人员需要与需求人员(客户)、领导及项目相关人员进行沟通,同时收集各种项目资料,对系统进行分析,确认测试的意图;确认客户对性能的态度;重点关注的性能指标。某系统需求中性能部分的说明如下要掌握哪些性能测试需求系统响应时间要求每秒完成的业......
  • 自动化测试
    自动化测试是指通过专门的自动化测试工具和脚本,对软件系统进行测试,从而提高测试效率、减少测试周期和成本,增强测试结果的可重复性和一致性。与手动测试相比,自动化测试具有以下优势:提高测试效率:自动化测试可以快速地执行大量测试用例,而且可以在不同的测试环境中运行,从而有效提高测试......
  • 如何用python的pysmb模块,下载smb服务器上的以deb结尾文件?
    需求:如何用python的pysmb模块,下载smb服务器上的以deb结尾文件?服务器在192.168.9.5扩展需求:有时候,也会下载以xxx开头的文件。实现方式:#!/usr/bin/envpython#-*-coding:utf-8-*-#安装依赖模块:pipinstallpysmbfromsmb.SMBConnectionimportSMBConnec......
  • JMeter02-性能测试关注点
    被测系统的组成被测系统由应用服务器和数据库服务器组成影响性能的因素硬件:CPU、内存、硬盘……操作系统:并发时缓存大小,缓存交换任务优先级网络:公共网络延迟、服务器本地网络速度、带宽、吞吐量中间件、Web服务器数据库服务器:索引设计等因素客户端:用户数和类型、活动频率......
  • JMeter03-性能测试基本概念
    性能测试类型性能测试类型包括负载测试、压力测试、强度测试、容量测试、并发测试、稳定性测试(可靠性测试、疲劳强度测试)、配置测试、失败测试等性能测试性能测试(PerformanceTesting):通过模拟生产运行的业务压力量和使用场景组合,测试系统的性能是否满足生产性能的需要。说明:......
  • linux服务器,nginx日志切割保存
    我们都知道,默认情况下,nginx的项目log是一直被累计写入的,随着时间越久,那么这个文件就会越大,这个时候如果我们要去做一些查找和排查就会比较困难,因为日志文件太大,操作起来比较费劲。因此我们为了规避这个问题,提出日志切割的方案。那日志切割的原理是怎么样的,我们来分析一下,我们先......
  • Linux服务器安装Kokkos-core 和 Kokkos-kernel
    说明由于实验室项目原因,需要跑一个Gmres算法,之前弄过kokkos,就想在kokkos-kernels里跑现有的GMRES算法库在此记录自己的安装的过程,以及自己踩过的一些坑。1.准备工作从Kokkos官网下载Kokkos以及Kokkos-kernels:https://github.com/kokkos/kokkos.git--Kokkos-corehttps:......