关于高性能Web服务的一点思考
下面这些概念对于专业做性能测试的会比较熟悉,但是对于开发人员不一定都那么清楚。
- 并发用户数: 某一时刻同时请求服务器的用户总数,通常我们也称并发数,并发连接数等。
- 吞吐率:对于web服务器来说就是每秒处理的请求数,req/sec.
- 服务器平均请求处理时间:服务内部的处理时间,可以理解为我们平时log里的时间。
- 用户平均请求延迟时间:用户发送一个请求到接收到响应的时间间隔。
并发用户数和吞吐率容易被人混淆,除非服务器刚好1秒内能处理完并发用户的请求,否则两者数值上没有必然联系。一般的服务器都有并发的限制,比如MongoDB的maxConns,Tomcat的maxThreads。
吞吐率和服务器的请求处理时间则互为倒数,其实都是用来衡量服务器内部质量的,而用户平均请求延迟时间则是在一定并发下用来衡量对单个用户的服务质量。
一般的随着并发越来越大,吞吐率是先升后降,因为平均服务器处理时间是吞吐率的倒数,所以它是先降后升,存在一个平衡点,往往超过这个点,吞吐率明显下降,服务器平均处理时间也会明显变大。这个平衡点就是我们做压力测试要寻找的,叫做服务器的最大吞吐率,有时候我们习惯了干脆直接叫做吞吐率了,这时的并发可以叫做最大并发数或者叫最佳并发数。很多人习惯说:某某服务支持多大多大并发,我理解应该就是指的这个数。
而用户平均请求延迟时间则会随着并发数的增加而变大,一般在达到服务器的最大并发数之前增加的会比较缓慢,超过之后会骤增。如果一直只有一个用户请求,那么用户平均请求延迟时间自然等于服务器平均请求处理时间(忽略网络耗时),但随着并发用户的增加,无论服务器的并发策略如何,用户的等待时间都会变长,因为假设理想情况,服务器资源无限,所有的请求都是并行处理也仅仅是“等于”,但现实是上下文切换,请求排队等等的代价不可忽略,所以具体到某个用户的等待时间就会变长。而服务器平均请求处理时间,随着资源的充分利用一开始反而可能会下降。

综上所述,如果用户平均请求延迟时间 » 服务器平均处理时间,忽略网络耗时的话,可以说服务器已经存在瓶颈了,说明实际大并发数已经超过服务器的最大并发处理能力了。
我们的生产环境现在就面临这样的问题,每天的峰值期间从前面Nginx看平均的响应时间已经达到了3s,但是Tomcat内部的处理时间其实并不到1s,剩下的时间耗在了哪?线程切换,请求排队…

那么如何在不加机器的情况下优化这个问题呢?既然瓶颈是服务器并发,那么就得想办法提高并发能力。具体到Tomcat可能是一些参数调优之内的,比如NIO,APR,但这些都做过了之后还有没有优化的空间呢。最近我准备验证下Servlet3.0的异步和Jetty的Continuation,总体的思路就是将容器线程和业务线程分开,减小并发的粒度来提高并发。但具体有没有效果很难说,只有测了才知道,想要并发越高,逻辑就得拆的越细,代价就越高。

最后,实际情况要复杂的多,考虑网络因素,用户实际的平均请求延迟时间会更大,而且通常我们缺少这样的数据参考,所以现在很多都在做端到端的监控。
关于高性能Web服务的一点思考的更多相关文章
- 高性能Web服务之lnmp架构应用
传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下.生成一个新的进程/线程需要事先备好其运 ...
- 高性能Web服务端 PHP vs Node.js vs Nginx-Lua 的对比分析
1. ngx_lua nodejs php 比较 我在研究一阵子ngx_lua之后发现lua语法和js真的很像,同时ngx_lua模型也是单线程的异步的事件驱动的,工作原理和nodejs相同,代码甚至 ...
- 关于纯移动web优点的一点思考
自己造个小概念,纯移动web就是手机浏览器上访问的网站^_^ 缺点就不说了,说几个随着硬件和网络发展会放大的优势. 1 相对app来说,完全无缝对接,只要符合html标准,一次开发全平台部署 2 推广 ...
- 尹吉峰:使用 OpenResty 搭建高性能 Web 应用
2019 年 8 月 31 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·成都站,原贝壳找房基础架构部工程师尹吉峰在活动上做了<使用 O ...
- [技术博客] 软工-Ruby on Rails前端工具链的配置以及对Web应用结构设计的一点思考
一.相关工具链简介 HAML HAML是专门面向Ruby on Rails模版语法设计的一门标记语言,其结合RoR的views部分模版语法的特点,对原来的*.html.erb(嵌入Ruby代码的HTM ...
- 【读书笔记】2016.12.10 《构建高性能Web站点》
本文地址 分享提纲: 1. 概述 2. 知识点 3. 待整理点 4. 参考文档 1. 概述 1.1)[该书信息] <构建高性能Web站点>: -- 百度百科 -- 本书目录: 第1章 绪论 ...
- 编写高性能Web应用程序的10个技巧
这篇文章讨论了: ·一般ASP.NET性能的秘密 ·能提高ASP.NET表现的有用的技巧和窍门 ·在ASP.NET中使用数据库的建议 ·ASP.NET中的缓存和后台处理 使用ASP.NET编写一个We ...
- web服务器之nginx与apache
最近准备架设php的web服务器,以下内容可供参考. 1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞 ...
- 构建高性能web站点--读书大纲
用户输入你的站点网址,等了半天..还没打开,裤衩一下就给关了.好了,流失了一个用户.为什么会有这样的问题呢.怎么解决自己站点“慢”,体验差的问题呢. 在这段等待的时间里,到底发生了什么?事实上这并不简 ...
随机推荐
- Linux Dynamic Shared Library && LD Linker
目录 . 动态链接的意义 . 地址无关代码: PIC . 延迟版定(PLT Procedure Linkage Table) . 动态链接相关结构 . 动态链接的步骤和实现 . Linux动态链接器实 ...
- MySQL备份原则
数据库备份遵守的原则: 定期对数据库进行备份 启用mysql服务器的二进制日志 备份文件命名既要有规律又要有意义 备份文件和数据库不要放在一个文件系统上 定期使用文件系统的备份功能来备份数据库的备 ...
- squid清除缓存
客户经常要求清除缓存 由于CDN后台只能支持单个url的 所以目录级别的只能用脚本 example:清除 www.123.com 下所以的缓存 #!/bin/bash TODAY=`date +%Y ...
- checking for tgetent()... configure: error: NOT FOUND!
今天centos出现了下面的异常: checking for tgetent()... configure: error: NOT FOUND! You need to install a termi ...
- C#实体图片下载与批量下载(自动保存功能)
新工作,第一个小任务,制作一个点击下载图片的功能.并提供批量下载操作.图片是字节流的形式,存放在数据库中的. 为了避免直接从数据库中,下载失败,会在本地保存一份. 进行压缩的是SharpZip这个压缩 ...
- AngularJs Cookies 操作
$cookiesProvider 使用$cookiesProvider改变$cookies服务的默认行为. 默认属性 path:字符串,cookies只在这个路径及其子路径可用.默认情况下,这个将会是 ...
- java编程思想-复用类总结
今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...
- uC/OS-II核心(Os_core)块
/*************************************************************************************************** ...
- 日志分析 第五章 安装logstash
logstash是java应用,依赖JDK,首先需要安装JDK,在安装jdk过程中,logstash-2.3.4使用JDK-1.7版本有bug,使用JDK-1.8版本正常,因此我们安装JDK-1.8版 ...
- python设计模式之--单例模式
python的单例模式就是一个类的实例只能自始自终自能创建一次.应用场景比如说数据库的连接池. #!/usr/bin/env python # coding=utf- class Foo(object ...