提高Web服务器并发响应的经历
1 前言
----------
最近一直在维护一个线上运行的旧系统,系统本身的问题很多,然而又有大量客户准备试用。之前一直存有侥幸心理,希望系统能神奇的顶过这段时间,但这个蜗牛般的系统残忍的告诉我们——我们被客户给投诉了。现在真的不得不正视这个问题并且需要快速的解决掉。
2 处理
----------
2.1 初步分析
=============
之前也初步分析过这个问题,定位在连接池那里有问题。现象是有大量的“Cannot open connections”的报错,dump出来的线程状态大部分都是停在等待获取连接那里。原先认为是dbcp连接池有问题,因为数据库那边的active连接数很低,后来把连接池的当前状态一直打印出来,发现连接池给出的当前active连接数却很高。我们先升级了dbcp的包,但是问题依旧。那么就开始调整连接池的参数,但是几经调整,在100个左右用户同时在线的情况下还是很容易崩溃。我们开始思考是不是到底问题是出在哪里了。
2.2 压力测试重现问题
=====================
这个时候最需要的就是压力测试来稳定重现问题,但这么紧急的情况下又没人会,怎么操作,难不成现装现学LoadRunner?!这个时候有个朋友给了一个非常好的建议,利用ab来模拟并发,直接请求某个action。这个很简单,就是手动登录一下系统,然后记录下来sessionID,再找到某个action需要提交的参数并写入一个文件,这里叫postdata.txt,最后执行ab -C sessionID=xxx -p postdata.txt -n 1000 -c 100 http://xxx/xxx.action。
刚开始感觉很奇怪,每次连接池中active连接到50多就会挂,但是具体数值还不是一个稳定的值。几经查找,在数据库那边查看当前session数量的时候发现居然是数据库最大连接超出了150的限制。
2.3 问题的修复
==============
接下来自然是怎么解决这个问题了。
在连接池参数中,我们反复测试,发现如果把maxactive调到一个很低的值,很容易报错。具体报错看了一下,是Timeout waiting for idle object,明显是等待连接超时了。那么自然想到去修改等待连接的超时时间,我们把maxWait从3000调整到8000,这样报错几乎就没有了。但这个参数修改是有一定问题的,因为用户可能要等8秒才能得到响应。这里主要是把maxActive调整到一个比较大的值。
对于数据库最大限制做了一下调整,processes调到300,sessions调到了335,这样暂时就没问题了。但是查到官方建议是中型应用是100个连接,大型应用是200个,我们这个怎么可能会用到这么多呢。这个问题在后面的教训中给了我们答案。
2.4 整装上阵
=============
我把以前出问题的日志和内存状态dump都那出来了,并把我们测试的是出问题时的情况做了对比,确实是一样的。基本可以确认我们找到了问题的原因。这个时候开始满怀信心的升级线上系统了。升级过程很顺利,但是悲剧再一次重演。
当用户登录人数在两百人的时候,系统已经慢的和蜗牛一样了。这个时候拿出日志发现连接池中激活连接居然达到了maxActive中设置的150,又开始有大量的连接超时,同时我们发现网页打开速度也奇慢无比。理论上当前的人数并不多,数据库慢也许是有各种可能,但tomcat应该完全有能力支持到这个情况的。我们系统真的有这么龊吗?
2.5 命悬一线
=============
这个时候已经比我们答应用户处理完问题的时间又过了10分钟,大量用户在线等的都已经非常焦躁不安了。但我们已经把之前分析得到的优化方案都用上了,貌似也没起到任何作用,而且这个时间已经也不允许我们做任何更复杂的优化了。正在这无比气馁的时候,有个同事想到可能是防火墙之类的问题吧,就索性把360给关掉了。奇迹终于发生了,系统的响应速度和数据库连接的速度大幅度提升,瞬间400多人同时登录上线速度还都嗖嗖的,数据库active连接最大也没超过30个。我真的恨死360了,这个给普通用户用的东西怎么能装到服务器上呢,这玩意对网络连接肯定是做了很多审查才导致速度严重下降。幸亏问题虽然没按时解决,但还算及时解决了,后来一圆场还能对付过去。心里一个石头放下了,突然身体也觉得非常疲惫。
3 总结
-----------
总结些什么能,难道是发现360不能在服务器上使用?!这当然是气话,这个过程还是有很多收获的。简单总结一下:
1)利用ab可以非常简单的模拟出并发访问,针对web程序更可以直接针对每个action进行测试。
2)对于复杂问题的解决,还是要先能稳定重现问题,这样才能更容易分析定位问题,从而找到有针对性的解决方案。
3)遇事冷静,要针对现象找到有确实可行、合理的解决方案。
4)最后不得不补充一下,别用360,特别是在需要提供服务的服务器上。
本文转自passover 51CTO博客,原文链接:http://blog.51cto.com/passover/578817,如需转载请自行联系原作者
提高Web服务器并发响应的经历的更多相关文章
- 修改Linux内核参数提高Nginx服务器并发性能
当linux下Nginx达到并发数很高,TCP TIME_WAIT套接字数量经常达到两.三万,这样服务器很容易被拖死.事实上,我们可以简单的通过修改Linux内核参数,可以减少Nginx服务器 的TI ...
- web服务器-并发服务器2
阅读目录 1.Web静态服务器-5-非堵塞模式 2.Web静态服务器-6-epoll 3.Web静态服务器-7-gevent版 4.知识扩展-C10K问题 一.Web静态服务器-5-非堵塞模式 单进程 ...
- 并发|WEB服务器并发
面试中容易被问到你们服务器的并发是多少?但是这个问题我问过许多人,没有得到一个准确的答案!我总结了一些不错的回答,分享给大家! 面试题: 你们公司的服务器并发是多少? 我的回答: 1.并发这个词,许多 ...
- Web服务器-并发服务器-Epoll(3.4.5)
@ 目录 1.介绍 2.代码 关于作者 1.介绍 epoll是一种解决方案,nginx就是用的这个 中心思想:不要再使用多进程,多线程了,使用单进程,单线程去实现并发 在上面博客实现的代码中使用过的轮 ...
- Python复习笔记(十)Http协议--Web服务器-并发服务器
1. HTTP协议(超文本传输协议) 浏览器===>服务器发送的请求格式如下:(浏览器告诉服务器,浏览器的信息) GET / HTTP/1.1 Host: www.baidu.com Conne ...
- Web服务器-并发服务器-长连接(3.4.4)
@ 目录 1.说明 2.代码 关于作者 1.说明 每次new_socket都被强制关闭,造成短连接 所提不要关闭套接字 但是不关闭的话,浏览器不知道发完没有啊 此时用到header的属性Content ...
- Web服务器-并发服务器-单进程单线程非堵塞方式(3.4.3)
@ 目录 1.分析 2.代码 关于作者 1.分析 当socket去监听的时候,是堵塞的状态 通过tcp_sever_socket.setblocking(False)去设置不堵塞 当socket发现没 ...
- Web服务器-并发服务器-协程 (3.4.2)
@ 目录 1.分析 2.代码 关于作者 1.分析 随着网站的用户量越来愈多,通过多进程多线程的会力不从心 使用协程可以缓解这一问题 只要使用gevent实现 2.代码 from socket impo ...
- Web服务器-并发服务器-多进程(3.4.1)
@ 目录 1.优化分析 2.代码 3. 关于作者 1.优化分析 在单进程的时候,相当于 是来一个客户,派一个人去服务一下 效率低,现在使用多进程来服务 假设场景 100个人同时访问页面 单进程:一次处 ...
随机推荐
- Nginx知多少系列之(五)Linux下托管.NET Core项目
目录 1.前言 2.安装 3.配置文件详解 4.Linux下托管.NET Core项目 5.Linux下.NET Core项目负载均衡 6.Linux下.NET Core项目Nginx+Keepali ...
- Linux:启动http服务
1.安装apache yum install httpd #根据提示,输入Y安装即可成功安装 systemctl start httpd.service #启动apache systemctl sto ...
- 【BIM】BIMFACE中创建疏散效果
背景 在BIM运维中,消防疏散是不可或缺的一环,当发生火警的时候,触发烟感器发生报警,同时启动消防疏散,指导现场工作人员进行疏散,及时准确地显示出疏散路线对争取疏散时间尤为重要.我将介绍如何在bimf ...
- CVPR2020文章汇总 | 点云处理、三维重建、姿态估计、SLAM、3D数据集等(12篇)
作者:Tom Hardy Date:2020-04-15 来源:CVPR2020文章汇总 | 点云处理.三维重建.姿态估计.SLAM.3D数据集等(12篇) 1.PVN3D: A Deep Point ...
- python3(二十) module
# 在Python中,一个.py文件就称之为一个模块(Module) # 1.最大的好处是大大提高了代码的可维护性. # 2.可以被其他地方引用 # 3.python内置的模块和来自第三方的模块 # ...
- 学习Saleforce | 业内第一份Salesforce学习者数据报告
自从自由侠部落这个Salesforce中文学习平台成立以来,我们接触到了越来越多的Salesforce的学习者,由衷感觉到这个学习生态圈愈发蓬勃发展. 为了了解Salesforce学习者的基本情况.现 ...
- Multiple Books多账薄
有些公司因管理需要配置多本账薄,比如管理帐和PRC,那么在Epicor 10中如何实现呢? 1创建 new Book: 2 created a map: Financial Management -& ...
- 你只要5行代码,拥有你的个性二维码,用Python生成动态二维码
如果想了解更多关于python的应用,可以私信我,或者点击下方链接自行获取,里面到资料都是免费的(http://t.cn/A6Zvjdun) 二维码满天飞,但是有没有想过Python也能制作出专属于自 ...
- D - Three Integers CodeForces - 1311D
题意: a<=b<=c 输出A,B,C要求B是A的倍数,C是B的倍数,并且输出a,b,c变成A,B,C需要的最小次数. 题解:写了半天的二分,后来发现思路错了,,,暴力就能过.. 三层fo ...
- JS Math&Date的方法 (下)
Date - 时间日期对象 一:Date 时间对象 - 它是处理时间日期的 时间日期对象 - js提供了一个专门用来创建日期对象的构造函数 Date new Date() 这是一 ...