在压测基于协程的http服务器的时候,出现问题,该如何去调试?
情况:协程是自己参考各路大神写的,然后基于这个协程库写了一个简单的http服务器,在通过ab进行压测的时候,如果ab的请求如下:
ab -c 2 -n 10000 http://127.0.0.1:9501/
压测了很多次都是没有问题的(可以完整的请求完这10000次)。
但是,一旦-c
的值大于2的时候,并且-n
的值比较大的时候,就会出现问题(无法完整的请求完这10000次)。
项目链接如下:
项目链接
http服务器代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <errno.h>
#include "log.h"
#include "coroutine.h"
#include "socket.h"
#include "net.h"
#include "fd.h"
#define HOST "0.0.0.0"
#define PORT 9501
#define MAX_BUF_SIZE 1024
#define LISTENQ 16
char *response_str = "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\nContent-Length: 11\r\n\r\nhello world\r\n";
void client_handle(tswCo_schedule *S, void *ud) {
int n;
int connfd;
char buf[MAX_BUF_SIZE];
connfd = (int)(uintptr_t)ud;
while (1) {
if ((n = tswCo_recv(S, connfd, buf, MAX_BUF_SIZE, 0)) < 0) {
tswWarn("tswCo_recv error");
}
if (n == 0) {
if (tswCo_close(S, connfd) < 0) {
tswWarn("tswCo_close error");
}
break;
} else {
if (tswCo_send(S, connfd, response_str, strlen(response_str), 0) < 0) {
tswWarn("tswCo_send error");
}
if (tswCo_close(S, connfd) < 0) {
tswWarn("tswCo_close error");
}
break;
}
}
}
void listen_service(tswCo_schedule *S, void *ud)
{
int sockfd;
int connfd;
struct sockaddr_in cliaddr;
socklen_t len;
sockfd = (int)(uintptr_t)ud;
while ((connfd = tswCo_accept(S, sockfd, (struct sockaddr *)&cliaddr, &len)) > 0) {
tswDebug("a new connection [%d]", connfd);
tswCo_create(S, TSW_CO_DEFAULT_ST_SZ, client_handle, (void *)(uintptr_t)connfd);
}
}
int start_service(tswCo_schedule *S)
{
int sockfd;
int on = 1;
sockfd = tswSocket_create(TSW_SOCK_TCP);
if (sockfd < 0) {
tswWarn("tswSocket_create error");
return -1;
}
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
if (tswSocket_bind(sockfd, TSW_SOCK_TCP, HOST, PORT) < 0) {
tswWarn("tswSocket_bind error");
return -1;
}
if (listen(sockfd, LISTENQ) < 0) {
tswWarn("%s", strerror(errno));
}
tswCo_create(S, TSW_CO_DEFAULT_ST_SZ, listen_service, (void *)(uintptr_t)sockfd);
tswCo_run(S);
return 0;
}
/*
* main coroutine
*/
int main(int argc, char const *argv[])
{
tswCo_schedule *S;
S = tswCo_open();
if (S == NULL) {
tswWarn("tswCo_open error");
return -1;
}
start_service(S);
tswCo_destroy(S);
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论