标签:Netty 句柄 端口 并发 调优 线程 连接 服务端 客户端
11 高并发性能调优
11.1 单机百万连接调优
11.1.1 如何模拟百万连接
使用两台虚拟机,一台服务端一台客户端
如何模拟呢?
情况1:一台Client一台Server,只能有6w连接,因为Client只剩下大概6w个端口可以去连接服务端
优化1:可以使用多个Client去连接服务端,要开启十几台虚拟机,麻烦
优化2:服务端启动8000~8100端口,且因为TCP是一个四元组概念:源ip、源端口、目标ip、目标端口;
这样Client同一个端口可以连接Server不同端口,会被当成不同的连接,这样就有600w连接,所以此处使用这种方法:
11.1.2 突破局部文件句柄限制
默认情况下,单个进程打开的句柄数非常有限,而一个TCP连接对应一个句柄,这样导致了一个服务端建立的连接数收到了限制,所以我们要突破句柄总量,即一个进程能够打开的最大文件数
首先使用ulimit -n,看看Linux一个进程能够打开的最大文件数(Linux中,一个TCP连接对应一个文件数),可以看到为1024
然后使用sudo vim /etc/security/limits.conf,添加如下两行:
#当前用户、限制、打开最大文件数、能够打开的最大文件数
* hard nofile 1000000
* soft nofile 1000000
重启即可
11.1.3 突破全局文件句柄限制
即Linux下所有进程能够打开的文件数
查看全局文件句柄:cat /proc/sys/fs/file-max
修改:sudo vi /etc/sysctl.conf
fs.file-max=1000000
sudo sysctl -p生效,然后重启即可
启动服务端客户端,全部连接成功后,如果发现没有到100w,那么使用htop查看服务端性能,可以发现CPU到100%了,所以无法继续运算了,不过也差不多了,可以通过加强机器的性能
11.2 Netty应用级别性能调优:响应时间从秒级到毫秒级的优化
11.2.1 瓶颈
在服务端的ChannelHandler的channelRead0方法里面进行的业务逻辑如果耗时过多,会使响应时间越来越长,因为处理每个客户端线程都要在这里进行等待,这时候是秒级别
11.2.2 优化
1.将耗时的业务操作放到单独的业务的线程池去执行,有结果后再给到客户端
这时候是毫秒级别,当然还会像之前一样,响应时间会持续地往上升到一个稳定值:1000qps里面有10个是 > 100ms的,对应到业务线程池的线程,可能很多线程会超过100ms,因此可以将线程数调大来降低这个比例(因为qps不会变,即客户端请求个数一定),这样<100ms的会更多
增大多少呢?可以慢慢试,或者使用”最佳线程数“公式
2.Netty提供了一种方式:可以把handler放到专门的线程池去处理,不用由NioEventLoop的线程处理
添加handler的时候再传入一个线程池(EventLoopGroup)即可
这种方式会将handler的所有方法都放到线程池去处理,如果分配内存,则在业务线程池里面分配,做不到内存的共享;第一种方式则可以自由选择要放到线程池的代码,可以将内存分配放在主线程里面,业务逻辑才放到业务线程池里,可以做到内存共享;
不过第一种实现简单,对业务代码没有侵入
标签:Netty,句柄,端口,并发,调优,线程,连接,服务端,客户端 来源: https://blog.csdn.net/qq_41594698/article/details/100586099
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。