下面这些概念对于专业做性能测试的会比较熟悉,但是对于开发人员不一定都那么清楚。

  • 并发用户数: 某一时刻同时请求服务器的用户总数,通常我们也称并发数,并发连接数等。
  • 吞吐率:对于web服务器来说就是每秒处理的请求数,req/sec.
  • 服务器平均请求处理时间:服务内部的处理时间,可以理解为我们平时log里的时间。
  • 用户平均请求延迟时间:用户发送一个请求到接收到响应的时间间隔。

并发用户数和吞吐率容易被人混淆,除非服务器刚好1秒内能处理完并发用户的请求,否则两者数值上没有必然联系。一般的服务器都有并发的限制,比如MongoDB的maxConns,Tomcat的maxThreads。

吞吐率和服务器的请求处理时间则互为倒数,其实都是用来衡量服务器内部质量的,而用户平均请求延迟时间则是在一定并发下用来衡量对单个用户的服务质量。

一般的随着并发越来越大,吞吐率是先升后降,因为平均服务器处理时间是吞吐率的倒数,所以它是先降后升,存在一个平衡点,往往超过这个点,吞吐率明显下降,服务器平均处理时间也会明显变大。这个平衡点就是我们做压力测试要寻找的,叫做服务器的最大吞吐率,有时候我们习惯了干脆直接叫做吞吐率了,这时的并发可以叫做最大并发数或者叫最佳并发数。很多人习惯说:某某服务支持多大多大并发,我理解应该就是指的这个数。

而用户平均请求延迟时间则会随着并发数的增加而变大,一般在达到服务器的最大并发数之前增加的会比较缓慢,超过之后会骤增。如果一直只有一个用户请求,那么用户平均请求延迟时间自然等于服务器平均请求处理时间(忽略网络耗时),但随着并发用户的增加,无论服务器的并发策略如何,用户的等待时间都会变长,因为假设理想情况,服务器资源无限,所有的请求都是并行处理也仅仅是“等于”,但现实是上下文切换,请求排队等等的代价不可忽略,所以具体到某个用户的等待时间就会变长。而服务器平均请求处理时间,随着资源的充分利用一开始反而可能会下降。

综上所述,如果用户平均请求延迟时间 » 服务器平均处理时间,忽略网络耗时的话,可以说服务器已经存在瓶颈了,说明实际大并发数已经超过服务器的最大并发处理能力了。

我们的生产环境现在就面临这样的问题,每天的峰值期间从前面Nginx看平均的响应时间已经达到了3s,但是Tomcat内部的处理时间其实并不到1s,剩下的时间耗在了哪?线程切换,请求排队…

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

最后,实际情况要复杂的多,考虑网络因素,用户实际的平均请求延迟时间会更大,而且通常我们缺少这样的数据参考,所以现在很多都在做端到端的监控。

关于高性能Web服务的一点思考的更多相关文章

  1. 高性能Web服务之lnmp架构应用

    传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下.生成一个新的进程/线程需要事先备好其运 ...

  2. 高性能Web服务端 PHP vs Node.js vs Nginx-Lua 的对比分析

    1. ngx_lua nodejs php 比较 我在研究一阵子ngx_lua之后发现lua语法和js真的很像,同时ngx_lua模型也是单线程的异步的事件驱动的,工作原理和nodejs相同,代码甚至 ...

  3. 关于纯移动web优点的一点思考

    自己造个小概念,纯移动web就是手机浏览器上访问的网站^_^ 缺点就不说了,说几个随着硬件和网络发展会放大的优势. 1 相对app来说,完全无缝对接,只要符合html标准,一次开发全平台部署 2 推广 ...

  4. 尹吉峰:使用 OpenResty 搭建高性能 Web 应用

    2019 年 8 月 31 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·成都站,原贝壳找房基础架构部工程师尹吉峰在活动上做了<使用 O ...

  5. [技术博客] 软工-Ruby on Rails前端工具链的配置以及对Web应用结构设计的一点思考

    一.相关工具链简介 HAML HAML是专门面向Ruby on Rails模版语法设计的一门标记语言,其结合RoR的views部分模版语法的特点,对原来的*.html.erb(嵌入Ruby代码的HTM ...

  6. 【读书笔记】2016.12.10 《构建高性能Web站点》

    本文地址 分享提纲: 1. 概述 2. 知识点 3. 待整理点 4. 参考文档 1. 概述 1.1)[该书信息] <构建高性能Web站点>: -- 百度百科 -- 本书目录: 第1章 绪论 ...

  7. 编写高性能Web应用程序的10个技巧

    这篇文章讨论了: ·一般ASP.NET性能的秘密 ·能提高ASP.NET表现的有用的技巧和窍门 ·在ASP.NET中使用数据库的建议 ·ASP.NET中的缓存和后台处理 使用ASP.NET编写一个We ...

  8. web服务器之nginx与apache

    最近准备架设php的web服务器,以下内容可供参考. 1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞 ...

  9. 构建高性能web站点--读书大纲

    用户输入你的站点网址,等了半天..还没打开,裤衩一下就给关了.好了,流失了一个用户.为什么会有这样的问题呢.怎么解决自己站点“慢”,体验差的问题呢. 在这段等待的时间里,到底发生了什么?事实上这并不简 ...

随机推荐

  1. Servlet —— 避免Servlet的并发同步问题

    Servlet的生命周期是由Servlet容器来负责的. Servlet容器通常采用单实例多线程的方式,减少Servlet创建实例的开销,提高效率. 当客户端第一次请求某个Servlet时,Servl ...

  2. C#和Javascript的try…catch…finally的一点差别

    C#中规定:如果程序的控制流进入了一个带finally块的try语句,那么finally语句块始终会被执行 例子: class Program { static void Main(string[] ...

  3. Spider爬虫清洗数据(re方法)

    import re s0 = 'BOY and GIRL' s1 = re.sub(r'BOY|GIRL', 'HUMAN', s0) print s1 # HUMAN and HUMAN 替换方法.

  4. 使用uWSGI部署django项目

    先说说什么是uWSGI吧,他是实现了WSGI协议.uwsgi.http等协议的一个web服务器,那什么是WSGI呢? WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx)与应用服务 ...

  5. 常见Android Native崩溃及错误原因

    http://www.droidsec.cn/%E5%B8%B8%E8%A7%81android-native%E5%B4%A9%E6%BA%83%E5%8F%8A%E9%94%99%E8%AF%AF ...

  6. jboss wildfly 外网访问

    在standalone.xml中: 找到下面三行,看到是要访问public(8080端口的)和management的interface,将interface中的127.0.0.1改为0.0.0.0即可 ...

  7. 说说css3布局

    使用float属性或position属性布局的缺点 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&qu ...

  8. 高性能JavaScript笔记三(编程实践)

    避免双重求值 有四个标准函数可以允许你传入代码的字符串,然后它才你动态执行.它们分别是:eval.Function.setTimeout.setInterval 事实上当你在javascript代码中 ...

  9. SSH(Struts Spring Hibernate开发框架)

    Spring(Model) Spring的核心思想是IoC和AOP,Spring使得管理对象更加方便,极大的降低组件之间的耦合度,实现了软件各层之间的解耦. Struts(View) 使用Struts ...

  10. mysql if exist坑

    TOP:BEGIN #Routine body goes here... IF EXISTS ( SELECT * FROM `user` WHERE `name` = in_user_name ) ...