springBootVersion = '1.5.10.RELEASE'
内置tomcat版本: embed-8.5.27
根据启动日志得知默认connection连接启动方式是NIO(org.apache.coyote.http11.Http11NioProtocol),
反编译源代码(AbstractEndpoint)得知其最大默认连接数maxConnections=10000,超过后进内置队列acceptCount,队列长度默认100; 内部最大线程数maxThreads默认200
接收请求用的NIO且最大连接数10000,推测瓶颈在执行线程数200,可在系统内存、CPU资源允许的条件下,适当调大maxThreads执行线程数,加大处理能力。
SpringBoot默认是以 java -Xmx256m -Xss256k -jar xx.jar
来运行内置Tomcat。
在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方 面,区别于 Windows的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows 是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些物理内存,Linux 都将能充分利用起来,发挥了硬件投资带来的好处,而Windows只将其做为摆设,即使增加8GB甚至更大。
Linux 的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为 cache 和 buffers ,以此提高数据访问性能。
Linux 优先使用物理内存,当物理内存还有空闲时,linux是不会施放内存的,即时占用内存的程序已经被关闭了(这部分内存就用来做缓存了)。也就是说,即时你有8G的内存,用过一段时间后,也会被占满。这样做的好处是,启动那些刚开启过的程序、或是读取刚存取过得数据会比较快,对于服务器很有好处。
你可以用 free 指令查看一下输出,用 used 减去 buffer 和 cache,才是你运行中的程序所占用的空间,举例如下:
total used free shared buffers cached
Mem: 8061672 7442680 618992 192 163748 5833736
-/+ buffers/cache: 1445196 6616476
Swap: 8191996 32540 8159456
7442680 - 163748 - 5833736 = 1445196
也就是说目前正在被使用的内存只有 1.3 G。不要被 7000多兆(合约7个G)的used吓住了。
---------------------------------------------------------------------------------2019-07-06---------------------------------------------------------------------------------------------------------------------------------------------
1、java nio底层实现是根据操作系统来的,linux 2.6内核之后用的是epoll (since Linux 2.6.28)。( https://blog.csdn.net/martin_liang/article/details/44278593 )
uname -a 或 cat /proc/version 得知公司centos的linux内核版本是2.6.32,支持epoll, 3.10.0-123.9.3.el7.x86_64
2、如果没用epoll则是使用的selector(),那么会有fd<=1024的限制,而epoll则是65535,且效率更高。( https://www.cnblogs.com/tid-think/p/10779043.html )
http://blog.sina.com.cn/s/blog_5f435c130101fduq.html
3、这玩意要手工启动配置? https://blog.csdn.net/fcly2013/article/details/19813393
其他参考:
https://mp.weixin.qq.com/s/s2XMgDBhLqvAfp_R8B9QIQ springboot高并发概论
https://www.cnblogs.com/rainbow1122/p/7881561.html linux多线程服务开发
https://blog.csdn.net/hunhun1122/article/details/79309400 Windows Socket 最大连接数
TcpTimedWaitDelay:确定 TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。windows默认4分钟,最小可改为30秒。
参考: IBM WebSphere Voice Server 在windows server 2003 下的典型配置
MaxUserPort = 65534 (Decimal)
MaxHashTableSize = 65536 (Decimal)
MaxFreeTcbs = 16000 (Decimal)
1:Connection timed out
在实际开发中经常会碰到Connection timed out的问题
当得到 Connection timed out: connect 的时候表示TCP路由不正常,原因有很多,可能是服务器无法ping通,可能是服务器(防火墙等)丢弃了该请求报文包,也可能是服务器应答太慢,又或者存在间歇性的问题(这种情况很难从日志文件中排查问题)。
2:Connection refused
当得到Connection refused: connect 异常的时候表示从本地客户端到目标IP地址的路由是正常的,但是该目标端口没有进程在监听,然后服务端拒绝掉了连接。
一个成功的tcp链接将会看到Syn,Syn-Ack,Ack,这也就是我们预期的TCP三次握手。当使用tcpdump或wireshark抓包工具来探测发送过来的请求报文包时,Connection refused将会看到Syn,Rst。
1562491953221,703,HTTP Request,Non HTTP response code: java.net.SocketException,Non HTTP response message: Socket operation on nonsocket: connect,Thread Group 1-172,text,false,,2530,0,967,967,http://localhost:8089/gateway/rest/test?username=linyang,0,0,703
1562491863074,2012,HTTP Request,Non HTTP response code: org.apache.http.conn.HttpHostConnectException,"Non HTTP response message: Connect to localhost:8089 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",Thread Group 1-31,text,false,,2825,0,1000,1000,http://localhost:8089/gateway/rest/test?username=linyang,0,0,2012
1562491864889,63,HTTP Request,Non HTTP response code: java.net.BindException,Non HTTP response message: Address already in use: connect,Thread Group 1-383,text,false,,2521,0,1000,1000,http://localhost:8089/gateway/rest/test?username=linyang,0,0,63
logback高并发优化: 启用AsyncAppender https://www.jianshu.com/p/3a1231f05f10
nginx优化:https://www.cnblogs.com/yueminghai/p/8657861.html https://blog.51cto.com/shu1983/1904942
linux优化: https://my.oschina.net/coderljp/blog/846978