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

2018-09-16 20:25:02 +08:00
 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 的都是靠缓存顶住的吗?不上缓存的话,我现在服务器的性能指标到底是否正常?
36066 次点击
所在节点    程序员
183 条回复
jswh
2018-09-17 09:19:19 +08:00
@abcbuzhiming 浏览器前端到服务器数据返回,其中包含了网络延时的。建议看看内网的查询数据。
zqyisasd
2018-09-17 09:26:59 +08:00
之前公司的 tomcat 线上并发只有 100 多一点,不敢说话了。
lscho
2018-09-17 09:31:15 +08:00
@v2orz 有什么不正常?网络延迟不计算吗? 20 多 ms 的网络延迟已经很低了。。。又不是内网测试
lttzzlll
2018-09-17 09:32:09 +08:00
先确定是不是数据库的问题,查询的部分可以直接返回假的内容。单独测试一下查询语句耗时。
sagaxu
2018-09-17 09:32:43 +08:00
@yhvictor tomcat 多开线程就是用来阻塞的,200 个线程都在阻塞等结果,谁来处理新的请求?如果只开 10 个线程,平均阻塞 1 秒的接口,qps 只有 10。
@micean 不用等 Java,Kotlin 协程下个版本正式发布。
lauix
2018-09-17 09:46:47 +08:00
单线程服务 500 已经很不错了,大多数都是 DB 不行,可以考虑 缓存 异步。
codingKingKong
2018-09-17 10:12:37 +08:00
看一下 GC, 之前我有一次是因为频繁 gc, 导致的吞吐量下降
q397064399
2018-09-17 10:15:53 +08:00
@neoblackcap #85 说实话我还是看好 Go 这种用户态线程的做法,异步 IO 回调这种方法始终是令人难受的
tailf
2018-09-17 10:21:27 +08:00
并发上万都是靠架构顶住的,单机 java+MySQL 500 这个数字已经很强了,换 PHP 估计也就 100。
Mush
2018-09-17 10:23:39 +08:00
缓存大法好, 适当的加缓存能显著提高响应速度. 我们公司有个请求量比较大(6 千万一天)的服务, 用了 1.75 个虚拟 cpu 就够了, 平均响应时间小于 5ms. 因为业务逻辑很简单, 多数请求直接命中缓存了.
mars0prince
2018-09-17 10:24:01 +08:00
差不多了,mysql 最简单的 select 每条平均执行时间也要 10ms
mars0prince
2018-09-17 10:25:54 +08:00
优化方法无非就是加机器,加缓存,读写分离,分库分表
tanranran
2018-09-17 10:26:07 +08:00
@mars0prince #131 #131 10ms 有问题吧
9684xtpa
2018-09-17 10:32:07 +08:00
感觉是资源加载太多,贷款的瓶颈啊,你们公司的网站的数据是不是都在服务器里啊,图片、视频啥的没有走 CDN,如果是的话,用户加载图片视频网页都会占用带宽的啊。


单纯的 curd,用 springmvc 和 mysql 不会有这么多大的延迟,只要你保证你的 sql 性能没问题,框架用的都是主流框架,剩下的除非一些框架 bug,没了。

加宽带把
Allianzcortex
2018-09-17 10:54:37 +08:00
@Mush 加缓存还需要改代码逻辑吧~如果能通过扩展硬件来解决的话感觉会简单诶
sorra
2018-09-17 11:03:34 +08:00
@rogerchen 似乎多数人只想要个简单直接的答案,不愿意哪怕多分析一下
面试看到爱动脑的都想赶紧发 offer,然而人家也很抢手啊
dragonsky
2018-09-17 11:05:19 +08:00
@9684xtpa 你的输入法好像暴露了什么(・∀・)
9684xtpa
2018-09-17 11:07:50 +08:00
@dragonsky #137 哈哈,我刚特地看了一下我的输入法,第一个是贷款,第二个才是带宽。。。。。。。。尴尬,说到贷款估计就是和房子有关系呗,生活不易啊
meetocean
2018-09-17 11:12:03 +08:00
找到原因,才能针对性的解决问题。
v2orz
2018-09-17 11:13:08 +08:00
@lscho #123
前面描述限制那么多,难道性能分析的时候会找一个网络延迟那么大的环境吗?除非阿里云傻了,同一可用区网络延迟能那么惨烈。但是按题主前面的回复,可以排除这个情况

基本查询耗费 20ms 以上这难道还能是正常情况啊?

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

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

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

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

© 2021 V2EX