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 1
@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 |