第 3 章 服务器并发解决能力
3.1 吞吐率
- 吞吐率:Web 服务器单位工夫内解决的申请数
- 最大吞吐率:单位工夫内服务器可能解决的最大申请数
- 压力测试:模仿大量并发用户继续发送 HTTP 申请,统计测试继续的总工夫,据此计算吞吐率。(个别会简化模型,对有代表性的特定申请进行压力测试)
3.1.1 压力测试的前提条件
- 并发用户数:某一时刻同时向服务器发送申请的用户总数。
- 总申请数
- 申请资源形容
3.1.2 申请等待时间
- 用户均匀申请等待时间:肯定并发用户数下,对于单个用户的服务质量
- 服务器均匀申请解决工夫:吞吐率的倒数
- Web 服务器应用多个执行流并发解决申请(交织应用 CPU 工夫片),单个用户的申请等待时间会拉长,但服务器均匀申请工夫可能缩小。
3.1.3 来一次压力测试
- 压力测试软件:ab,LoadRunner,Jmeter
-
ab 测试:
ab -n1000 -c10 http://xxx.com/test.html #-n1000 示意总申请数 1000 #-c10 示意并发用户数 10
申请后果
Concurrency Level: 10 Time taken for tests: 7.616 seconds Complete requests: 1000 Failed requests: 0 Non-2xx responses: 1000 Total transferred: 374000 bytes HTML transferred: 178000 bytes Requests per second: 131.30 [#/sec] (mean) Time per request: 76.161 [ms] (mean) Time per request: 7.616 [ms] (mean, across all concurrent requests) Transfer rate: 47.96 [Kbytes/sec] received
吞吐率
Requests per second = Complete requests / Time taken for tests
用户均匀申请等待时间Time per request = Time per request / (Complete requests / Concurrency Level)
服务器均匀申请解决工夫Time per request(across all concurrent requests) = Time taken for tests / Complete requests
3.1.4 持续压力测试
- 并发策略的设计,就是在服务器同时解决较多申请的时候,正当协调并充分利用 CPU 计算和 I / O 操作,使其在较大并发用户的状况下提供较高吞吐率。
3.2 CPU 并发计算
- 过程(fork):由内核调度,担当分配资源的实体,通过过程描述符与数据关联
- 子过程:将父过程所以数据复制到本人的地址空间,继承父过程所有上下文信息
- 轻量级过程(clone):容许共享地址空间,文件,反对数据共享
- 线程:pthread 在用户态实现多线程治理;LinuxThreads 将线程和轻量级过程一对一关联,由内核过程调度器治理
- 过程调度器(Scheduler):保护所有可运行过程队列(Run Quere),和一个包含所有休眠过程,僵尸过程的列表
-
过程优先级:通过 top 察看
PR 优先级属性:过程调度器调配给过程的工夫片长度,单位为时钟个数,Linux 个别为 10ms NI 优先级动静调整值
-
零碎负载:运行队列中任何时刻至多存在一个过程,那就是正在运行的过程。
cat /proc/loadavg 0.00 0.01 0.00 1/382 4154 前 3 个数 最近 1,5,15 分钟的零碎负载 // 1 此时运行队列中的过程数 // 382 过程总数 // 4154 最初创立的过程 ID
- 过程切换:挂起正在运行的过程,复原以前挂起的过程,称为过程切换(上下文切换)
- 过程挂起:将过程在 CPU 寄存器中的数据拿进去暂存在内核态堆栈中
- Nmon 监控:ContextSwitch 上下文每秒切换次数
-
查看某时刻 httpd 过程数
ps afx | grep httpd | wc -l
- 总结:如果心愿服务器反对较大并发数,就要尽量减少上下文切换次数,最简略的做法就是缩小过程数,应用线程并配合其余 I / O 模型来设计并发策略
- IOWait:CPU 闲暇并且期待 I / O 操作实现的工夫比例(通过 Nmon 失去 CPU 监控数据)
- 锁竞争:当一个工作占用锁住资源的时候,其余工作都在期待锁的开释。要尽量减少并发申请对于共享资源的占用。