第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: 10Time taken for tests: 7.616 secondsComplete requests: 1000Failed requests: 0Non-2xx responses: 1000Total transferred: 374000 bytesHTML transferred: 178000 bytesRequests 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个别为10msNI 优先级动静调整值
零碎负载:运行队列中任何时刻至多存在一个过程,那就是正在运行的过程。
cat /proc/loadavg0.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监控数据)
- 锁竞争:当一个工作占用锁住资源的时候,其余工作都在期待锁的开释。要尽量减少并发申请对于共享资源的占用。