epoll惊群测试

本文通过测试分析了在不同内核版本下,UDP和TCP的惊群现象。结果显示,较新内核如4.18在某些情况下能减少惊群,但并未完全消除。在UDP测试中,新版内核通常只唤醒一个进程;TCP测试中,虽然大多数情况唤醒一个进程,但也存在唤醒多个的情况。结论指出,内核针对epoll惊群进行了优化,但仍有改进空间。
摘要由CSDN通过智能技术生成

一、udp惊群测试

1、模型

在这里插入图片描述

2、代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netdb.h>
#include <errno.h>
#include <fcntl.h>

#define PROCESS_NUM 2
#define MAXEVENTS 1000

int sock_create_bind(int port){
    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in addr;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(port);
    addr.sin_family = AF_INET;

    if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0){
        return -1;
    }

    return fd;
}

int make_noblocking(int fd){
    int val = fcntl(fd, F_GETFL);
    val |= O_NONBLOCK;
    if (fcntl(fd, F_SETFL, val) < 0){
        perror("fcntl set");
        return -1;
    }
    return 0;
}

int main(int argc, char const *argv[])
{
    int udp_fd, i;
    struct epoll_event *events;

    struct iovec iov[1];
    struct msghdr msg;
    struct sockaddr sa;
    char buf[1024];

    if (argc < 2){
        printf("Input port\n");
        exit(1);
    }

    if ((udp_fd = sock_create_bind(atoi(argv[1]))) < 0){
        perror("socket_create_bind error");
        exit(errno);
    }

    if (make_noblocking(udp_fd) < 0){
        perror("make_noblocking error");
        exit(errno);
    }

    events = malloc(MAXEVENTS * sizeof(struct epoll_event));
    if (!events){
        perror("malloc err");
        exit(errno);
    }

    for (i = 0; i < PROCESS_NUM; i ++){
        
        int pid = fork();
        
        if (pid == 0){
            int epoll_fd = epoll_create(MAXEVENTS);
            if (epoll_fd < 0){
                perror("Create epoll err");
                exit(errno);
            }

            struct epoll_event event;
            event.events = EPOLLIN | EPOLLET;
            event.data.fd = udp_fd;
            if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, udp_fd, &event) < 0){
                perror("epoll_ctl err");
                exit(errno);
            }

            while (1){
                int num;
                num = epoll_wait(epoll_fd, events, MAXEVENTS, -1);

                // sleep(1);
                printf("process %d get %d events\n", getpid(), num);


                for (i = 0; i < num; i ++){
                    if (!(events[i].events & EPOLLIN)){
                        printf("get error event\n");
                        continue;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值