eventlet 学习测试

  eventlet是一款使用Python编写的为高并发的网络编程而设计的库。它通过greenlet提供的协程功能,让开发者可以不用将以往的多线程等并发程序的开发方式转变成异步状态机模型,就能直接使用select/epoll/kqueue等操作系统提供的支持高并发IO接口,并且能尽可能地发挥它们在并发上的优势。
  我用eventlet写一个服务端的socket接口,客户端的测试使用thread进行连接测试。代码如下。

服务端

客户端

  测试过程。服务端放在阿里云服务器上,单CPU,内存1G,带宽3M,CentOS6.5 64位。使用pypy启动。操作系统参数如下:
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
vm.swappiness = 50
net.core.netdev_max_backlog = 2048
net.core.somaxconn = 250000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.lo.arp_announce=2
fs.file-max=12000000
fs.nr_open=11000000

ulimit -n 为 65535

  客户端使用自己笔记本的虚拟机、raspberry pi和一台云主机。然后用bash脚本调用多个客户端,虚拟机上python启动10个客户端,在raspberry pi上使用pypy启动6个客户端。云主机上一个200连接。

  启动后服务端系统指标如下图。
tcpevenlet-top
tcpeventlet-count
  使用telnet连接1300端口信息回复正常。
  查看系统日志如下,被认为是洪水攻击
Sep 13 22:34:06 iZ23i076qv9Z kernel: possible SYN flooding on port 1300. Sending cookies.
修改系统参数如下,问题暂时环节。
net.ipv4.tcp_max_syn_backlog = 4096

  总结eventlet的性能确实不一般,因为连接后操作并不多,所以cpu基本没有使用,跑了一会,内存使用也下降到800M。操作系统使用内存300M到400M。
  综上所述,当前连接1万连接应该没有问题。实际应用中根据单个务处理需要的CPU和并发数算出CPU需要量,内存为1G可以1到2万并发,C10K问题解决。golang也支持协程,但是不知道能不能高出一个数量级。

发表评论

电子邮件地址不会被公开。 必填项已用*标注