-
Notifications
You must be signed in to change notification settings - Fork 2.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
about the benchmark #38
Comments
感谢ACL作者关注我们项目! 项目刚开源,感谢大家的意见! |
感觉您的回复。单线程调度(如nginx, redis,irc之类的)服务程序一般CPU亲和性都会比较好,资源竞争也比多线程调度小的多,workflow 内部是多线程池之间的协作,性能能达到如此之高也确实非常不错了。另外,workflow 的代码写的比较干净整齐,也很值得大家去学习。 |
经过组里同学的努力,参照您建议的做法,在C200的情况下nginx已经做到了29w+的QPS,workflow各种调也能上升一些。 int main()
{
WFHttpServer server(proc);
int sockfd=socket(...);
bind(sockfd, ...);
// listen(sockfd, ...); // no need listen
fork();
fork();
server.serve(sockfd);
pause();
server.stop();
...
} 以上代码启动一个4进程server。通过serve接口,还可实现精确的优雅重启(需要把stop拆解为shutdown+wait_finish)。 |
@zhengshuxin |
惊群问题我们之前message queue模块实验过,方法和ACL的解决方案差不多,确实比普通消息队列在高QPS的时候优化很多。后来message queue用了更加简单粗暴的方法,就是读写用两个队列,读的时候把整个写队列交换走。这个方法的问题是在QPS不太高的时候,会多加一次锁。我其实更喜欢每个消费者在一个condition的方法。 |
不错,每在都在进步,赞一个! |
workflow 内部线程池的设计方式本身是有瓶颈的,其是一种常规的线程池设计模型,但当线程池中线程数较大时会因 pthread_cond_signal 的设计导致惊群问题(具体原因可以 man 一下 pthread_cond_signal 或 https://blog.csdn.net/zsxxsz/article/details/88388425 );
另外,与 nginx 的性能对比可能也存在问题,你们不妨把 nginx 的日志关闭再对比测试一下(我对比测试后发现nginx性能还是远高于workflow的)。nginx 因为其单线程非阻塞的设计方式,其CPU亲和性要远好于线程池的设计方式,其性能基本是随着CPU核数和进程数增加呈线性增长的,而 workflow 中的 demo 在线程数(其中的 pollers 和 handlers)到一定数时就无法再提升了,应该还是线程池中的锁碰撞和 CPU 亲和性等原因);
还有就是nginx的 HTTP 协议解析过程是规范的(从其对url的解析便可以看出),并且功能逻辑也是较为复杂的。
The text was updated successfully, but these errors were encountered: