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

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 的都是靠缓存顶住的吗?不上缓存的话,我现在服务器的性能指标到底是否正常?
35345 次点击
所在节点    程序员
183 条回复
showecho
2018-09-16 21:59:11 +08:00
技术我不懂,但是 500 并发说很低的人,你们真的实操过吗?
并发 500,一天流量得多少,有多少企业能到?
wuhhhh
2018-09-16 22:00:39 +08:00
tomcat 本身并发访问就 600 是最佳,越往后越容易丢失,大概 1000 左右就会崩溃,所以如果想要做高并发,就必须考虑动态静态资源的分离,用 nginx 做反代或者静态资源存储,动态就靠缓存或者升级服务器来实现,再往上的解决就不是程序员的问题,是架构师本身能力了
SlipStupig
2018-09-16 22:00:45 +08:00
@abcbuzhiming 硬件没问题,多分析代码问题吧
seancheer
2018-09-16 22:00:52 +08:00
首先排查网络,磁盘,cpu 问题
然后观察 java gc
最后代码涉及到 io 的地方进行打点,观察方法执行的时延
一步步缩小怀疑段
micean
2018-09-16 22:00:59 +08:00
不到 10 个线程,做的 mysql 的 crud 的场景,那能不慢吗?
把线程池加到 200 就正常了
如果你想要异步化的 crud,抛弃 jdbc,转 scala,有人重写了 mysql 的客户端
gsggwbz
2018-09-16 22:02:40 +08:00
用消息队列进行流量削峰,java 后台服务层用线程池实现并行异步执行,数据层上缓存,并发量集中的页面考虑做成静态页面,减轻服务端压力,负载均衡集群做下。
micean
2018-09-16 22:04:15 +08:00
再说一下,一般说的按核心数计算线程数是用来给非阻塞线程的,阻塞线程要按实际情况调试
metrxqin
2018-09-16 22:07:26 +08:00
很奇怪,你先试试导出堆栈。
ccnccy
2018-09-16 22:11:04 +08:00
前几天有 2 台服务器负载超高,30 左右,看了下很多 time wait, 两台都是 centos 7.1, 看了下其他的 6.9 的都没问题,后面把这两天装回 centos6.9,问题解决。
opengps
2018-09-16 22:20:56 +08:00
首先问下,你的 mysql 在什么硬盘上,云服务器的硬盘性能都很低。
你有必要换 ssd 或者直接使用阿里云提供的 RDS for mysql.

看到很多人觉得 500 不是高并发,我笑了,实际上很多人的项目,使用单台云服务器,根本支撑不到 500 并发,做一次公网环境的压测,会深深地意识到自己技术水平的不足,然后才会理解为什么云架构这么受欢迎(简单说:流量来了加机器即可解决)。
weizhen199
2018-09-16 22:28:32 +08:00
500 的并发事务的话,已经非常大了
CoderGeek
2018-09-16 22:28:50 +08:00
1.如果有 slow api 分析看一下是否涉及到 cud 持久化操作调用有问题
2.看一下 sql 的 slow。 优化一下你的 sql
3.阿里云 ecs 的实例类型 是否购买成共享型 cpu 了 被别的人强了资源也会这样 cpu 直接爆了 (仔细观察一下服务器资源)
后面才是代码 gc 和 数据库配置
还有不是核心数据做 log 异步处理一下
D3EP
2018-09-16 22:29:57 +08:00
楼上说的对。你说的线程数是 CPU 核心数的 1.5 或 2 倍 指的是计算密集型的任务。Tomcat 默认 200 个线程。不要看书看得太教条了。多开点线程没啥问题。
CoderGeek
2018-09-16 22:30:31 +08:00
我之前买的几台服务器实例 全部是共享型的 有一次数据库的那台服务器 cpu 直接爆了 前几周 ali 才告诉我 我都要坑死了 挪了二十几台服务器 没气死我了...
SoCrazyStone
2018-09-16 22:31:48 +08:00
收藏了,看大佬 battle
CoderGeek
2018-09-16 22:32:56 +08:00
我现在用的是 rds mysql 和自建的核心数据库 仔细看下服务器吧。。。
zorui
2018-09-16 22:34:40 +08:00
@ittianyu 应届生无疑。。。
lxrmido
2018-09-16 22:38:16 +08:00
@abcbuzhiming
4 核 8G 不是问题,瓶颈压根就不在 CPU 和内存上,对于 500 个写数据库的并发操作而言,瓶颈在磁盘 IO 上,只是不知道是底层存储云的网络 IO 还是 SSD 的磁盘 IO,假如你们没有对数据库配置比较了解的人的话,换 RDS、加机器的性价比可能会比较高。
Infernalzero
2018-09-16 22:39:06 +08:00
你怕是没改配置还用的是 BIO 吧?
hand515
2018-09-16 22:39:13 +08:00
日志打太多了吗

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

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

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

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

© 2021 V2EX