提高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个人同时访问页面 单进程:一次处 ...
随机推荐
- 数据库学习 day2 检索数据
上一节我们介绍了什么是数据库,以及一些基本的数据库术语 这一课介绍使用SELECT语句从表中检索一个或多个数据列. 关键字(Keyword) 作为SQL组成部分的保留字.关键字不能用作表和列的名字(类 ...
- MySQL入门,第一部分,全局管理命令
1.连接数据库命令 mysql -h localhost -u root -p 回车后输入密码即可连接到数据库 2.显示当前mysql管理系统中的所有数据库 SHOW DATABASES; 3.显示当 ...
- Linux学习,账号管理与权限管理
linux系统本来不认识账号,只是通过UID(用户ID)和GID(所属组ID)来区分账号属性的.而这对应的目录如下: UID ===> /etc/passwd GID ===> /etc/ ...
- 页面存在多个url,使用jmeter进行遍历操作
有一次遇见一个问题:进入网站后,有多个相同的url,但是仅url后面的路径中id有区别,如下图:这时我想要遍历点击查看url详情内容:那么就可以使用一个“逻辑控制器---foreach控制器” 如下: ...
- Powershell基础---帮助系统
帮助系统能带给我们什么? 1.快速找到命令,无需使用Bing或者Google 2.运行命令时候返回了错误信息,帮助系统可以告诉我们如何正确使用该命令 3.多个命令组合执行完成复杂的工作,帮助系统告诉我 ...
- Unity 游戏框架搭建 2019 (二十九) 方法所在类命名问题诞生的原因
我们在整理阶段解决了一些意外的问题.但是这些问题仅仅只是被解决而已,我们并没有去思考过这些问题是为什么产生的?以及在以后我们如何去避免这些问题的产生? 方法所在类的命名问题,最后我们通过方法分类解决了 ...
- Os-Hax: 1 靶机记录
靶机地址:172.16.1.197 Kali地址:172.16.1.108 1 信息搜集 靶机首页 相关信息查看 端口扫描: 开放22和80 目录扫描: 访问http://172.16.1.197/c ...
- [linux] [nginx] 一键安装web环境全攻略phpstudy版,超详细!
找到运行中的服务器(实例). 打开这个主要是看它的IP,是公网ip,公网ip,公网ip,重要的事情说三遍. 接下来我们可以不用在阿里云上操作了,直接用客户端操作,这两个客户端就是Xshell 5和Xf ...
- Java工作流引擎-集团模式下的权限 设计与实现
关键字 工作流开发框架权限设计.用户组.岗位.集团模式应用. java工作流程引擎, .net 工作流引擎,工作流开发框架 相关的表结构 -- 相关组织-表结构. SELECT No,Name,Par ...
- 在.NET Core中用最原生的方式读取Nacos的配置
背景 之前老黄写过一篇<ASP.NET Core结合Nacos来完成配置管理和服务发现>简单介绍了如何让.NET Core程序接入Nacos,之前的SDK里面更多的是对Nacos的Open ...