![]() | 1 clino 2014-07-23 11:20:41 +08:00 试试 openresty ? |
![]() | 2 canesten 2014-07-23 11:23:28 +08:00 硬件条件有什么限制? 3-4之间有什么特殊的耗时运算吗? |
![]() | 4 mengskysama 2014-07-23 11:38:12 +08:00 nginx妥妥不靠谱啊,你在后端又加个东西 折腾libev吧 然后就是带宽了,200*2000=4,000,000字节 50M带宽妥妥的。 |
![]() | 5 canesten 2014-07-23 11:38:25 +08:00 你测试用的硬件什么配置? i7 8 GB gigabit Ethernet 的情况netty达到50W/秒是没问题的 |
![]() | 6 mengskysama 2014-07-23 11:39:34 +08:00 发现少了个0. |
![]() | 7 icqdany 2014-07-23 11:44:50 +08:00 swoole+php |
![]() | 8 feilaoda OP @canesten i5 2.4GHz, 8G, 并发是10K下的50w/s? 我测下来,并发1000,在6w+/s,和你差距好大; @mengskysama 暂时是想找找有没现成的方案,nginx可能不适合这种长链接的案例? |
![]() | 9 lsylsy2 2014-07-23 11:46:02 +08:00 @mengskysama openresty性能很高,撑得住的 以及LZ可以试试golang |
![]() | 11 canesten 2014-07-23 11:49:36 +08:00 SORRY 网卡跑满了吗? |
12 missdeer 2014-07-23 11:53:47 +08:00 前些天在码农周刊看到的 http://blog.csdn.net/ghj1976/article/details/27996095 文中附有不少高质量的参考资料 |
![]() | 13 dingyaguang117 2014-07-23 12:07:25 +08:00 @canesten C10K 内核参数应该怎么调好呢?求问 |
![]() | 14 dndx 2014-07-23 12:07:31 +08:00 性能问题出在哪?是内存还是 CPU 不够用?消息处理占用多少资源? 另外通信协议是什么?是 WebSocket 之类的还是私有协议? 20k 对 Linux 来说根本就是小菜一碟,应该是哪里没弄好。 |
![]() | 15 feilaoda OP |
![]() | 16 feilaoda OP |
![]() | 19 feilaoda OP |
![]() | 20 canesten 2014-07-23 13:15:38 +08:00 @dingyaguang117 当前系统的全局最大打开文件数 单个进程最大打开文件数 缓冲区内存大小 打开socket快速回收 socket重用 还有就是 net.ipv4.tcp_max_orphans net.ipv4.tcp_synack_retries 一类的 |
![]() | 21 CMGS 2014-07-23 13:22:53 +08:00 并发吃内存,下发吃CPU。。。 你并发C20K不算多,关键是10w/s-40w/s……这个数值对于大多数CPU来说压力比较大吧 |
23 tjmao 2014-07-23 13:26:35 +08:00 via iPhone @feilaoda 四核才120%占用率啊,剩下的时间不是在等待,就是给同一台物理机上别的虚拟机用去了。 如果程序写access log,你也关掉试试看。曾用此法榨干Apache HTTPd的性能。 |
![]() | 24 feilaoda OP @canesten @tjmao @CMGS 最新进展,找了一台物理机,8核,8Gb CentOS,客户端:i5 2.4Mhz, 8Gb 内核参数: fs.file-max = 999999 net.ipv4.tcp_rmem = 4096 4096 16777216 net.ipv4.tcp_wmem = 4096 4096 16777216 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 15 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.netdev_max_backlog = 4096 net.core.somaxcOnn= 4096 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_tw_buckets = 360000 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_synack_retries = 2 [root@sz-monitor ~]# ulimit -n 1000000 [root@sz-monitor ~]# ulimit -Sn 1000000 [root@sz-monitor ~]# ulimit -Hn 1000000 并发10000,ab -n 5000000 -c 10000 Requests per second: 70806.95 [#/sec] (mean) Time per request: 141.229 [ms] (mean) Time per request: 0.014 [ms] (mean, across all concurrent requests) Transfer rate: 5255.20 [Kbytes/sec] received 网卡的速度 05:16:19 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 05:16:24 PM lo 0.20 0.20 0.10 0.10 0.00 0.00 0.00 05:16:24 PM eth0 147588.73 75031.99 14179.64 10316.23 0.00 0.00 0.00 rxkB/s 14179.64 txkB/s 10316.23 CPU在200%-400%左右 内存在3.5%左右 正常速度70806.95/s,离400000/s差距甚远啊 |
![]() | 25 canesten 2014-07-23 17:51:04 +08:00 @feilaoda 这个是你的服务器网卡速度么? rxkB/s 14179.64 txkB/s 10316.23 算起来和你说的 3、每个链接每秒发送10个到20个消息,大小为100字节左右 比较相符了 10000并发的话差不多是每秒每并发14个消息 也就是说你这个测试就是每秒低于14万的测试 怎么可能得到40万的结果? 看样子网卡是收到了所有的测试压力 而且发送的数据量远多于你描述的 100字节的五分之一 按说 发送的带宽达到2.xMB应该就是完成所有的请求了吧 是不是你自己的测试客户端有什么问题 另 可以试试多开几个客户端同时压 再另 请使用netty 4.0.21并打开native transport,使用epoll 请尽量使用PooledDerictByteBuf并预先分配好足够多的内存 |
![]() | 26 canesten 2014-07-23 18:07:42 +08:00 另外加上TCP报头什么的 我强烈怀疑你客户端的输出能力也就是7W/秒了 |
27 hellojinjie 2014-07-23 18:13:05 +08:00 @canesten 我也觉得是测试客户端的问题,我测试的时候,ab 运行在不同的机器上得到的数据是不一样的。 ab 运行在性能较差的笔记本上,得到的数据A ab 运行在性能较好的笔记本上,得到的数据B 数据B要比数据A好。。。 |
![]() | 28 canesten 2014-07-23 18:26:03 +08:00 |
![]() | 29 wecoders 2014-07-23 18:37:32 +08:00 |
![]() | 31 canesten 2014-07-23 18:59:34 +08:00 当然你也可以打开Nagle’s Algorithm来节省TCP头来节省些带宽 |
![]() | 32 barbery 2014-07-23 21:31:14 +08:00 这种需求,果断openresty啊~ |
![]() | 33 CMGS 2014-07-23 21:48:42 +08:00 - -你这CPU已经扛不住了啊。。。 |
35 nezhazheng 2014-07-24 09:14:11 +08:00 @canesten 请教大神,一直不太明白netty的native transport意义是啥,JDK1.7不已经就是epoll了吗 |
![]() | 36 canesten 2014-07-24 10:10:02 +08:00 ![]() @nezhazheng 是从1.5 JVM添加了NIO就开始支持了的 具体实现是sun.nio.ch.EPollSelectorImpl http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/nio/ch/EPollSelectorImpl.java 这里具体的select操作还是在JVM内的 Netty的革新在于 io.netty.channel.epoll.Native https://github.com/netty/netty/blob/master/transport-native-epoll/src/main/java/io/netty/channel/epoll/Native.java 这是一个全JNI的设计 所有的操作都是在JVM外的 所以效能和C++一样 它依赖于 sudo apt-get install autoconf automake libtool make gcc-multilib tar |
37 nezhazheng 2014-07-24 10:16:50 +08:00 @canesten 明白啦,也就是说Netty的natvie transport epoll实现比JDK原生的epoll性能要好是吧? |
![]() | 38 canesten 2014-07-24 10:23:54 +08:00 |
39 nezhazheng 2014-07-24 10:39:10 +08:00 恩,netty确实是非常牛B的框架,感觉Netty应该是Java世界最优秀的框架了 |
![]() | 40 canesten 2014-07-24 11:00:35 +08:00 @nezhazheng Java世界里网络通信的库肯定是Netty首选了 Netty进步的速度很快 社区也很活跃 库里面有很多对现成协议的支持 很多其他的框架也采用了Netty作为网络层的基础 比如Grizzly,VertX |