读《构建高性能Web站点》服务器并发处理能力 - 1

一台Web服务器在单位时间内能处理的请求越多越好,这也成了Web服务器的能力高低所在,它体现了咱们常说的"服务器并发处理能力"。浏览器

吞吐量服务器

Web服务器的并发处理能力,通常使用单位时间内服务器处理的请求数来描述其并发能力,习惯称其为吞吐率(Throughput),单位是"reqs/s"。多线程

  • 并发用户数并发

人们经常把并发用户数和吞吐率混淆,实际上,它们并非一回事,吞吐率是指在必定并发用户数的状况下,服务器处理请求能力的量化体现;并发用户数就是指在某一时刻同时向服务器发送请求的用户总数。异步

采用多线程的并发对于同一个域名下的URL的并发下载数是有最大限制的,具体限制视浏览器的不一样而不一样,好比,在HTTP/1.1下,IE7支持两个并发链接,IE8支持6个并发链接,Firefox3支持4个并发链接。另外一方面,Web服务器通常也会限制同时服务的最多用户数,好比Apache的MaxClients参数。ide

CPU并发计算函数

服务器之因此能够同时处理个请求,在于操做系统经过多执行流体系设计使得多个任务能够轮流使用系统资源,这些资源包括CPU、内存以及I/O等。工具

进程

多执行流的通常实现即是进程。性能

进程的调度有内核来进行,从内核的观点来看,进程的目的就是担当分配系统资源的实体。同时,进程也能够理解为记录程序实例当前运行到什么程度的一组数据,多个进程经过不一样的进程描述符与这些数据进程关联。测试

每一个进程都有本身独立的内存地址和生命周期。进程的建立使用fork()系统调用。

轻量级进程

因为进程之间相对独立,没法共享数据。为此,在Linux2.0以后,提供了对轻量级进程的支持,它由一个新的系统调用clone()来建立,并由内核直接管理,像普通的进程同样独立存在,各自拥有进程的描述符,可是这些进程已经容许共享一些资源。

轻量级进程减小了内存的开销,并为多进程应用程序的数据共享提供了直接支持。

线程

POSIX 1003.1c为Linux定义了现成的接口"pthread"。从内核角度来看,多线程只是一个普通的进程,它是由用户态经过一些库函数模拟实现的多执行流,因此多现成的管理彻底在用户态完成。这种实现方式下线程切换的开销相比于进程和轻量级进程要少,但它在多处理器的服务器(SMP)表现较差,由于只有内核的进程调度器才有权分配多个CPU的时间。

POSIX线程的另外一种是现实LinuxThreads,它能够说是内核级线程(Kernel-Level Threads),由于它经过clone()来建立线程,也就是说,它的实现原理是将线程和轻量级进程一对一关联,每一个线程实际上就是一个轻量级进程,这样使得线程彻底由内核的进程调度器来管理,因此他对于SMP的支持较好,但线程切换的开销要比用户态线程多一些。

LinuxThreads已经加入了glibc和libc的目前版本。

进程调度器

内核中的进程调度器(Scheduler)维护着各类状态的进程队列。在Linux中,进程调度器维护者一个包含全部可运行进程的队列,称为"运行队列",一集一个包括全部休眠进程和僵尸进程的列表。

进程调度器的一项重要工做就是决定下一个运行的进程,这个执行前后顺序经过进程优先级进行处理,进程优先级由进程本身决定,但在进程运行时进程调度器会动态的调整它们的优先级。

Linux中进程的优先级属性为Priority,在top结果中用PR表示,而对于进程的动态调总体如今进程的nice属性,在top结果中用NI表示。

1_20150420090229.jpg

PR所表明的是进程调度器分配给进程的时间片长度,单位是时钟个数,一个时钟须要多长时间跟CPU的主频以及操做系统平台有关,好比Linux上通常为10ms,那么PR值为20则表示这个进程的时间为200ms。

Linxu2.6的进程调度器偏心I/O操做密集型的进程,由于这些进程在发起I/O操做后一般都会阻塞(除异步I/O),不会占用太多CPU时间,。

系统负载

在任什么时候刻经过 /proc/loadavg,能够查看系统运行队列的状况。

1_20150420132734.jpg

其中6/1564,6表示测试运行队列中的进程个数,而1564则表示此时的进程总数。最右边的25689表示到此时为止,最后建立的一个进程ID。左边的0.2四、0.5二、0.58三个数值分别表示最近1分钟、5分钟、15分钟的系统负载。

系统负载是在单位时间内运行队列中就绪等待的进程的平均值,系统负载越高,表明CPU越繁忙。

进程切换

为了让全部的进程能够轮流使用系统资源,进程调度器在必要的时候挂起正在运行的进程,同时恢复之前挂起的某个进程,这种行为称为进程切换,也就是"上下文"。

一个进程被挂起的本质就是将它在CPU寄存器中的数据拿出来暂存在内核态堆栈中,而一个进程恢复工做的本质就是将它的数据从新载入CPU寄存器。

Nmon是一个Linux监视工具,它能够提供基于服务器终端命令的监视页面。利用Nmon对服务器某个时刻的抽样结果以下:

1_20150420134200.jpg

ContextSwitch表示这时上下文切换平均每秒12614.9次,这是操做系统正常运转所进行的必要工做。

IOWait

IOWait是指CPU空闲而且等待I/O操做完成的时间比例。IOWait每每不能表明I/O操做的性能,它的设计出发点是用来衡量CPU性能的。

1_20150420142106.jpg

IOWait很高的时候,说明当前任务的CPU时间比I/O操做时间比较少,经过Nmon获得CPU监控数据以下图:

1_20150420142300.jpg

此时IOWait为0%,系统不繁忙。


—————————— 本文同步发布于 ZHANGSR 个人我的博客  ——————————

相关文章
相关标签/搜索