开发者社区> 问答> 正文

Java,单机服务器如何充分利用服务器性能,达到最大并发量?:报错

23号当天12点一瞬间有大量的用户涌进来,具体多少人不好说,我看TCP链接是6千左右。

我的服务器配置如下:

数据库是使用阿里云的PolarDB,8核32GB,有读写分离,最大IOPS是64000,我查看过数据库相关压力,数据库几乎没有波动,排除是数据库原因造成的,我们的业务相对简单,且大部分查询是单表查询,数据量很小。

服务器是使用阿里云的ECS,8核16G,CPU占用最高不到百分之二十,基本都在百分之五左右,内存占用也没有什么波动,CPU和内存没有充分得到利用。

我是使用的spring boot 部署,容器是tomcat,配置如下:

server.tomcat.accept-count=500
server.tomcat.max-connections=30000
server.tomcat.max-threads=2000
server.servlet.session.timeout=3600s
server.max-http-header-size=1024000

我启动的时候给JVM分配了内存,命令如下:

     nohup java -server  -Xms10240m -Xmx10240m -jar xxx.jar &

另外我使用的是nginx代理到tomcat的,当天高峰期服务瘫痪的时候,nginx部署的另外一个静态页也同时不能访问,所以我怀疑是nginx或tomcat在哪一个环节出现了问题。

以下是当天12点-16点的一些服务器监控截图:

    

 

所以我想请教一下大家,这是哪个环节的问题造成了瓶颈,有哪些优化方案?

展开
收起
kun坤 2020-06-07 09:02:41 1418 0
1 条回答
写回答
取消 提交回答
  • nginx的静态页面都进不去的话应该是OS的TCP出了问题吧,要不看看你这个服务器当前的文件描述符数量`ulimit -n`。

    ######回复 @snailkky : 解决了没?是这个原因吗?######回复 @口口口S口口口 : 真是太感谢你了! 我现在很怀疑就是这个原因造成的,我去试试看。######回复 @snailkky : :cold_sweat:我也只是知道这个东西,或许你可以写个测试用例试一下,用Jmeter定个6000进程访问看看######一般每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。 是这个原因造成的吗?######65535######

    负载均衡,可以先开3个nginx,9个项目。

    ######你这种就是性能不行, 上来就是分布式, 负载均衡。 明显几千连接,资源系统资源占用不高,是什么环节出了问题。 搞分布式,负载均衡就是掩耳盗铃######回复 @天空-sky : worker_connections 我配置了65535,另外worker_processes 我配置为8######nginx 还有worker_connections配置,可以了解下######

    密集IO情况下的Nginx调优方案:

    nginx进程数调到CPU核数的1.5倍,并且把每个进程平均绑到每个CPU上,多出来的让Linux自动调度到空闲CPU。

    突然并发的情况下,Tomcat调优方法:

    调成多进程+多线程运行模式,并且空闲时保留进程不少于CPU核数的一半。

    nginx和tomcat采用fastcgi方式互交。

    ######

    我简单看了一下,服务器很正确,监控正常,你的高峰瘫痪是指?

    ######就是很多用户进不来,我自己也进不去,加载不出来,nginx部署的另一个静态页也无法访问######

    单机的配置降一降,拆分成多节点呗。

    ######

    使用令牌桶做限流处理

    ######

    我更好奇你这个监控是怎么看到的,为什么我的云监控没你的这么细

    ######额,懂了,但是你好像是升级版的,我的是免费版的! 看了下升级版的,一个月都要1099:joy:######在云服务监控-云服务器ECS,你点进去,再点单个的监控,就可以显示这个图表了。######

    光看这个不太好分析,信息量太少。首先tomcat本身支持的并发就不高,到了6000肯定是没办法支持的,即使你将你的maxThread设置为2000,以你机器的性能也无法发挥线程的优势,反而增加了CPU线程切换的资源耗费。如果流量真的有这么大,那需要考虑做集群来承载。另外如果你的应用是IO型的,可以试试tomcat的NIO方式。

    ######我是spring boot2,tomcat默认就是nio######高版本的tomcat好像默认都是nio,那如果是这样的话,高配服务器就发挥不了它的性能,感觉挺鸡肋的。######看症状貌似你的服务器是共享实例,积分用完之后cpu占用率不能超过20%######我这个是通用型实例 不是共享型######

    看下带宽

    ######没有,因为我也怕是带宽的问题,然后我又升级到了60M,程序也没有变化。######回复 @snailkky : 出问题的那天,带宽使用情况怎么样?有没有出现不足######现在是5M带宽,但我那天临时升级到了20M
    2020-06-07 09:02:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载