• 各种调优


    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

  • 相关阅读:
    NGUI Sprite 和 Label 改变Layer 或父物体后 未更新深度问题
    unity销毁层级物体及 NGUI 深度理解总结
    unity 2d 和 NGUI layer
    关于NGUI与原生2D混用相互遮盖的问题心得
    CentOS7为firewalld添加开放端口及相关操作
    Python 操作redis有序集合(sorted set)
    win10下安装redis 服务
    python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别
    解决最小化安装Centos7后无法上网的问题,以及安装成功后的基本配置
    在mysql中使用group by和order by取每个分组中日期最大一行数据,亲测有效
  • 原文地址:https://www.cnblogs.com/lyhero11/p/10488412.html
Copyright © 2020-2023  润新知