遇到真正的高并发问题了,特来求助

2018 年 9 月 16 日
 abcbuzhiming
以前做的项目,要么服务器够多,要么访问量比较分散,一天虽然人多,但是都是不同时段。所以没遭遇到访问瓶颈。这次真刀真枪的需要进行一次单服优化,然后就发现单服性能不可思议的低。大致情况如下:
应用服务器是 Tomcat,在阿里云上的 4 核心的 xero,8GB 内存,10MB 带宽,技术实现是 spring mvc,并不是特别复杂的计算业务,说难听点仅仅是 crud,而且输出的是纯粹的 json,没有其它的静态文件之类的东西。然后 MySQL 数据库在和应用服务器同一区域的另外一台阿里云服务器上,类似的配置,4 核心,8GB 内存,用的是高效 SSD。
这样的两台(一组)服务器,能抗住多少并发呢,500 不到。。。

然后开始初步分析,发现一个问题,就是哪怕是单纯的数据库读业务,从浏览器请求到服务器,服务器从数据库读取完毕到返回给前端,最快也要 20-30ms 左右,稍微复杂点的数据结构就上 100ms 了,如果按这个计算,每秒每个线程的处理能力理论最快也就 50 个并发请求,4 核心的机器上,JVM 的线程池一般也就核心的 1.5-2 倍,顶多不到 10 个线程,这样一算,单服理论并发处理能力确实只有 500 不到。。。

我不死心于是回头去找以前的类似服务器做测试,结果发现性能是类似的,只不过当年是靠着服务器够多顶住了罢了。

我知道肯定会有人说,上缓存啊,我当然知道上缓存,我的困惑是,难道只有上缓存一条路,那些并发上 w 的都是靠缓存顶住的吗?不上缓存的话,我现在服务器的性能指标到底是否正常?
37589 次点击
所在节点    程序员
183 条回复
lscho
2018 年 9 月 17 日
@iyaozhen 所以 20ms 的话,如果算上你电脑网络到机房的网络延迟,已经算是很低了,并且你离机房还比较近。。如果北京到广州,绝对不可能低于 30ms 的。

还有你说复杂点的数据结构就超过 100ms,这个根据你的描述,没法判定原因。你要先确定不是网络带宽原因,再去看是不是服务器或者数据库的问题。
liuxu
2018 年 9 月 17 日
可以看看 112,133 楼的建议
exmario
2018 年 9 月 17 日
@abcbuzhiming 当然不能公网做性能测试,那会受带宽或网络限制,本地的数据测试才是性能测试,你做的那个叫综合访问测试,已经不是单性能问题了
exmario
2018 年 9 月 17 日
正确做法应该是申请 2 台同网段的阿里云服务器,然后 2 服务器之间内网 ip 互连测试
flight2006
2018 年 9 月 17 日
没做特殊优化的话单机 500qps 到头了,优化还是有空间的,从数据库到 jvm gc 到 tomcat 线程池
wph95
2018 年 9 月 17 日
你这个 500 并发是 500 qps 吗, 感觉楼主信息给的不足。// 虽然感觉要么 RDS 瓶颈了(写的 sql 有问题),要么 Tomcat 调好
我建议找个 apm 软件装上,跑个几天收集些信息。(反正常见几家 APM 公司都提供免费试用)
sampeng
2018 年 9 月 17 日
哦。阿里云是么?
突然想到。。阿里云有个压力测试服务。不知道现在是否免费。可以用他那个测。
doggg
2018 年 9 月 17 日
@monsterj 晚点肛我。我已经说明 500 如果是接口的并发量,如果每次请求都需要 N 次 SELECT 那性能应该没什么大问题,如果 500 并发=500SELECT 那绝对存在问题。我的回答已经表明这个疑问了咯。
fakeJas0n
2018 年 9 月 17 日
换 jetty 试试?
ala2008
2018 年 9 月 17 日
我一直以为是单个 tomcat 的上限是几百左右啊
yhvictor
2018 年 9 月 17 日
@sagaxu 我的理解是再多线程,能同时做的事情也就是核心数。所以多开无益,开个 queue 放进去就好了。
wjygamedev
2018 年 9 月 17 日
楼主:是否考虑到做缓存。
1. memcached.
2. Redis
看看怎么上缓存方便,在同步读取数据库并返回的地方,用缓存做个隔离带,并发应该有所提升。
不过有时间的话,还是简易,从入口到出口,把统计数据做一下,这样更能有的放矢。
wawehi
2018 年 9 月 17 日
把数据库用云 DB 测试看看, VPS 不适合建 Mysql, IO 太低
linuxchild
2018 年 9 月 17 日
看看慢查询呗~
dudesun
2018 年 9 月 17 日
数据库用高效云盘不合理,建议 ssd 云盘或者直接 RDS
abcbuzhiming
2018 年 9 月 17 日
@wawehi 我用的是阿里云 ECS 建立的 MySQL 服务器,ECS,高 IO 类型,SSD 硬盘
sagaxu
2018 年 9 月 17 日
@yhvictor 逻辑简单用 queue 没问题,复杂的时候,异步编程风格心智负担太重了。如果异步写起来轻松,就不会搞协程解放双手了。
jjx
2018 年 9 月 17 日
阿里云的 云 ssd 同本地 ssd 性能差距一倍以上
wawehi
2018 年 9 月 17 日
@abcbuzhiming 直接用阿里云 DB, 自建的 DB 远比不上他们建的.
woostundy
2018 年 9 月 17 日
CPU 都没吃满一定是连接数太少了,把服务线程池加大到 CPU 到 80+%

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/489883

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX