构建高性能WEB站点笔记二

构建高性能WEB站点笔记

由于是跳着看的,后面看到有提到啥epoll模型,那就补充下前面的知识。web

第三章 服务器并发处理能力

3.2 CPU并发计算

  • 进程
    • 好处:cpu 时间的轮流使用、对CPU计算和I/O操做进行很好的重叠利用。
    • 进程的调度有内核进行。从内核的观点看,进程的目的就是担任分配系统资源的实体。同时,进程也能够理解为记录程序实例当前运行到什么程度的一组数据。多个程序经过不一样的进程描述符与这些数据进行关联。
    • 每一个进程都有本身的独立内存空间和生命周期。当子进程被父进程建立后,便将父进程地址空间的全部数据都复制到本身的地址空间。彻底继承父进程的全部上下文信息,它们之间能够通讯,可是不互相依赖,也无权干涉彼此的地址空间。
    • 进程的建立使用fork()系统调用。
  • 轻量级进程
    • 因为进程之间相对独立,它们之间各自维护庞大的地址空间和上下文信息,没法很好地低成本共享数据,因此采用大量进程的Web服务器(好比Apache的prefork模型)在处理大量并发请求时,内存的大量消耗会成为性能提高的制约因素。可是,进程的优越性有时候偏偏体如今其相互独立所带来的稳定性和健壮性方面。
    • clone()建立轻量级进程,由内核直接管理,像普通的进程同样独立存在,各自拥有进程描述符,可是这些进程已经容许共享一些资源,好比地址空间、打开的文件等。轻量级进程减小了内存开销,并为多进程应用程序的数据共享提供了直接支持,但上下文切换的开销仍是在所不免。
  • 线程
    • 多线程的管理彻底在用户态。可是某些系统中, 内核线程也被支持,线程管理由内核进行。
  • 系统负载
    • 在进程调度器维护的运行队列中,任什么时候刻都至少存在一个进程,那就是正在进行的进程。cat /proc/loadavg查看运行队列的状况。
    • 定义:单位时间内运行队列中就绪等待的进程数平均值。
  • IOWait
    • 定义:CPU空闲而且等待I/O操做完成的时间比例。数组

      3.3 系统调用

      进程有两个运行模式:用户态和内核态,进程一般运行在用户态,这时候可使用CPU和内存来完成一些任务,而当进程须要对硬件外设进行操做的时候(读磁盘文件、发送网络数据),就必须切换到内核态。浏览器

  • 减小没必要需要的系统调用,优化Web服务器性能。缓存

    3.5 持久链接

    在Web应用层通讯,因为HTTP的无状态特性,使得HTTP通讯绝不依赖于TCP长链接,长久以来习惯了“一次性”的HTTP通讯,即一次TCP链接处理一个HTTP请求。服务器

HTTP长链接须要浏览器和Web服务器的共同协做。一方面,浏览器须要保持一个TCP链接并重复利用,不断发送多个请求,另外一方面,服务器不能过早的主动关闭链接。网络

Apache中,经过httpd.conf中的以下参数进行配置:
KeepAliveTimeout 30浏览器的设置能够经过修改注册表修改超时时间。数据结构

动机:尽可能减小链接次数,尽可能重用链接通道。多线程

3.6 I/O模型

  • PIO 与 DMA
    • PIO 磁盘和内存之间的数据传输经过CPU控制。数据通过CPU存储转发。
    • DMA 不通过CPU而直接进行磁盘和内存的数据交换。在DMA模式下,CPU只须要向DMA控制器下达命令,让DMA控制器来处理数据的传送便可。DMA控制器经过系统总线来传输数据,传输完毕再通知CPU,这样在很大程度下降了CPU占有率,大大节省了系统资源。
  • 同步阻塞I/O
    • 同步阻塞I/O是指当进程调用某些涉及I/O操做的系统调用或库函数时,好比accept()、send()、recv()等,进程便暂停下来,等待I/O操做完再继续运行。
  • 同步非阻塞I/O
    • 同步阻塞I/O中,进程实际上等待的时候可能包括两部分,一个是等待数据的就绪,另外一个是等待数据的复制。对网络I/O来讲,前者的时间可能要更长一些。
    • 不一样的是,同步非阻塞I/O不会等待数据就绪,若是数据不可写或者不可读,它会当即告诉进程,好比咱们使用非阻塞recv()接收网络的时候,若是网卡缓冲区没有可接受的数据,函数就及时返回,告诉进程没有数据刻度。
    • 进程执行屡次轮询来看数据是否就绪,这花费大量CPU时间,使得进程处于忙碌等待状态。
    • 非阻塞I/O通常只针对网络I/O有效。咱们只要在socket选项设置中使用O_NONBLOCK便可,这样对于该socket的send()或者recv()便采用非阻塞方式。值得注意的是,对于磁盘I/O,非阻塞I/O并不产生效果。
  • 多路I/O就绪通知
    • 提供了对大量文件描述符就绪检查的高性能方案,容许进程经过一种方法来同时监视全部文件描述符,并能够快速获取全部就绪的文件描述符,而后只针对这些文件描述符进行数据访问。
    • I/O就绪通知只是帮助咱们快速得到就绪的文件描述符,当得知数据就绪之后,就访问数据自己而言,仍然须要选择阻塞或者费组设的访问方式,通常咱们选择非阻塞方式,以防止任何意外的等待阻塞阻塞整个进程。好比有时候就绪通知只是表明一个内核的提示,也许此时未见描述符还没有真正准备好或者已经被客户端关闭链接。

了解如下几种UNIX:并发

  • select 经过一个select()系统调用来监视包含多个文件描述符的数组,当select()返回之后,该数组中就绪的文件描述符便会被内核修改标志位,使的进程能够得到文件描述符从而进行后续的读写操做。
    • 优:扩平台支持
    • 缺:单个进程可以监视的文件描述符的数量存在最大限制。
    • select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增加。
  • poll 本质上和select差异不大,可是没有最大文件描述符的限制。
  • epoll 被公认为Linux2.6下性能最好的多路I/O就绪通知方法。同时支持水平触发和边缘触发。
    • 水平触发:select()和poll()将就绪的文件描述符告诉进程后,若是进程对其没有进行I/O操做,那下次调用select()和poll()再次报告这些文件描述符,因此它们通常不会丢失就绪的消息。
    • 边缘触发:SIGIO是告诉咱们哪些文件描述符刚刚变成就绪状态,它只说一遍,若是咱们没有采起行动,那么它将不会再次告知。
  • 内存映射

定义:Linux提供一种访问磁盘文件的特殊方式,它能够将内存中某块地址空间和咱们要指定的磁盘文件相关联,从而把咱们队这块内存的访问转换为对磁盘文件的访问。
* 大多数状况下,使用内存映射能够提升磁盘I/O的性能,它无须使用read()或者write()等系统调用来访问文件,而是经过mmap()系统调用来创建内存和磁盘文件的关联,而后像访问内存同样自由地访问文件。异步

直接IO

  • 在MySQL中,对应Innodb存储引擎,其自身能够进行数据和索引的缓存管理,因此它对于内核缓冲区的依赖不是那么重要。MySQL提供了一种实现直接I/O的方法,在my.cof配置中,在分配Innodb数据空间文件的时候,使用raw分区跳过内核缓冲区,直接I/O。
    sendfile

  • 大多数时候,咱们向web服务器请求静态文件,这个处理请求的过程,磁盘的数据要先通过内核缓冲区,而后到达用户内存空间,由于是不须要任何处理的静态数据,因此它们又被送到网卡对应的内核缓冲区,接着再被送入网卡进行发送。
  • Linux中,sendfile将磁盘文件的特定部门直接传送到客户端的socket描述符,加快了静态文件的请求速度。

异步I/O

  • 阻塞和非阻塞IO是指当进程访问的数据若是还没有就绪,进程是否须要等待,简单说至关于函数内部的实现区别,即还没有就绪时是直接返回仍是就绪等待;
  • 同步和异步是指数据访问的机制,同步通常指主动请求并等待I/O操做完毕的方式,当数据就绪后在读写的时候必须阻塞。异步是指主动请求数据后即可以继续处理其余任务,随后等待I/O操做完毕的通知,这可使进程在数据读写时也不发生阻塞。

    3.7 服务器并发策略

    本质上讲,全部到达服务器的请求都封装在IP包中,位于网卡的接收缓存区中,这时候Web服务器软件要作的是不断地读取这些请求,而后进行处理,并将结果写到发送缓冲区,这其中包含了一些列I/O操做和CPU计算, 而设计一个并发策略的目的,就是让I/O操做和CPU计算尽可能重叠进行,一方面要让CPU在I/O等待时不要空闲,另外一方面让CPU在I/O调度上尽可能花费最少的时间。