若何提高服务器并发处置能力

若何提高服务器并发处置能力

存储服务器是什么?其特征有哪些?

作者:潇洒一剑
泉源:cnblogs.com/zengjin93/p/5569556.html

说明

以下内容为入门级先容,意在对老手艺作较全的总结而不是较深的研究。主要参考《构建高性能Web站点》一书。

 

什么是服务器并发处置能力

一台服务器在单元时间里能处置的请求越多,服务器的能力越高,也就是服务器并发处置能力越强

 

有什么方式权衡服务器并发处置能力

1. 吞吐率

吞吐率,单元时间里服务器处置的最大请求数,单元req/s

 

从服务器角度,现实并发用户数的可以理解为服务器当前维护的代表差别用户的文件形貌符总数,也就是并发毗邻数。

 

服务器一样平常会限制同时服务的最多用户数,好比Apache的MaxClents参数。

 

这里再深入一下,对于服务器来说,服务器希望支持高吞吐率,对于用户来说,用户只希望守候最少的时间,显然,双方不能知足,以是双方利益的平衡点,就是我们希望的最大并发用户数。

 

2. 压力测试

有一个原理一定要先搞清楚,如果100个用户同时向服务器划分举行10个请求,与1个用户向服务器延续举行1000次请求,对服务器的压力是一样吗?

 

现实上是不一样的,因对每一个用户,延续发送请求现实上是指发送一个请求并吸收到响应数据后再发送下一个请求。

 

这样对于1个用户向服务器延续举行1000次请求, 任何时刻服务器的网卡吸收缓冲区中只有1个请求,而对于100个用户同时向服务器划分举行10个请求,服务器的网卡吸收缓冲区最多有100个守候处置的请求,显然这时的服务器压力更大。

 

压力测试条件思量的条件

  • 并发用户数: 指在某一时刻同时向服务器发送请求的用户总数(HttpWatch)
  • 总请求数
  • 请求资源形貌
  • 请求守候时间(用户守候时间)
  • 用户平均请求的守候时间
  • 服务器平均请求处置的时间
  • 硬件环境

 

压力测试中体贴的时间又细分以下2种:

  1. 用户平均请求守候时间(这里暂不把数据在网络的传输时间,另有用户PC内陆的盘算时间盘算入内)
  2. 服务器平均请求处置时间

 

用户平均请求守候时间主要用于权衡服务器在一定并发用户数下,单个用户的服务质量;而服务器平均请求处置时间就是吞吐率的倒数。

 

一样平常来说,用户平均请求守候时间 = 服务器平均请求处置时间 * 并发用户数

 

若何提高服务器并发处置能力

 

 

怎么提高服务器的并发处置能力

1. 提高CPU并发盘算能力

服务器之以是可以同时处置多个请求,在于操作系统通过多执行流系统设计使得多个义务可以轮流使用系统资源。

 

这些资源包罗CPU,内存以及I/O. 这里的I/O主要指磁盘I/O, 和网络I/O。

 

多历程 & 多线程

多执行流的一样平常实现即是历程,多历程的利益可以对CPU时间的轮流使用,对CPU盘算和IO操作重叠行使。这里的IO主要是指磁盘IO和网络IO,相对CPU而言,它们慢的可怜。

 

而现实上,大多数历程的时间主要消耗在I/O操作上。

 

现代盘算机的DMA手艺可以让CPU不介入I/O操作的全过程,好比历程通过系统挪用,使得CPU向网卡或者磁盘等I/O装备发出指令,然后历程被挂起,释放出CPU资源,守候I/O装备完成事情后通过中止来通知历程重新停当。

 

对于单义务而言,CPU大部门时间空闲,这时刻多历程的作用尤为重要。

 

多历程不仅能够提高CPU的并发度。其优越性还体现在自力的内存地址空间和生命周期所带来的稳定性和健壮性,其中一个历程溃逃不会影响到另一个历程。

 

然则历程也有如下瑕玷

  1. fork()系统挪用开销很大: prefork
  2. 历程间调剂和上下文切换成本: 削减历程数目
  3. 重大的内存重复:共享内存
  4. IPC编程相对对照贫苦

 

削减历程切换

当硬件上下文频仍装入和移出时,所消耗的时间是非常可观的。可用Nmon工具监视服务器每秒的上下文切换次数。

 

为了只管削减上下文切换次数,最简朴的做法就是削减历程数,只管使用线程并配合其它I/O模子来设计并发计谋。

 

还可以思量使用历程绑定CPU手艺,增添CPU缓存的命中率。若历程不停在各CPU上切换,这样旧的CPU缓存就会失效。

 

削减使用不必要的锁

服务器处置大量并发请求时,多个请求处置义务时存在一些资源抢占竞争,这时一样平常接纳“锁”机制来控制资源的占用。

 

当一个义务占用资源时,我们锁住资源,这时其它义务都在守候锁的释放,这个征象称为锁竞争

 

通过锁竞争的本质,我们要意识到只管削减并发请求对于共享资源的竞争。

 

好比在允许情况下关闭服务器接见日志,这可以大大削减在锁守候时的延迟时间。要最大水平削减无辜的守候时间。

 

这里说下无锁编程,就是由内核完成这个锁机制,主要是使用原子操作替换锁来实现对共享资源的接见珍爱。

 

使用原子操作时,在举行现实的写操作时,使用了lock指令,这样就可以阻止其他义务写这块内存,制止泛起数据竞争征象。原子操作速率比锁快,一样平常要快一倍以上

 

例如fwrite(), fopen(),其是使用Append方式写文件,其原理就是使用了无锁编程,无锁编程的庞大度高,然则效率快,而且发生死锁概率低。

 

思量历程优先级

历程调剂器会动态调整运行行列中历程的优先级,通过top考察历程的PR值

 

思量系统负载

可在任何时刻查看/proc/loadavg, top中的load average也可看出

 

思量CPU使用率

除了用户空间和内核空间的CPU使用率以外,还要关注I/O wait,它是指CPU空闲而且守候I/O操作完成的时间比例(top中查看wa的值)。

 

2. 思量削减内存分配和释放

服务器的事情过程中,需要大量的内存,使得内存的分配和释放事情尤为重要。

 

可以通过改善数据结构和算法复制度来适当削减中心暂且变量的内存分配及数据复制时间,而服务器自己也使用了各自的计谋来提高效率。

 

例如Apache,在运行开始时一次申请大片的内存作为内存池,若随后需要时就在内存池中直接获取,不需要再次分配,制止了频仍的内存分配和释放引起的内存整理时间。

 

再如Nginx使用多线程来处置请求,使得多个线程之间可以共享内存资源,从而令它的内存总体使用量大大削减。

 

另外,nginx分阶段的内存分配计谋,按需分配,实时释放,使得内存使用量保持在很小的数目局限。

 

另外,还可以思量共享内存

 

共享内存指在多处置器的盘算机系统中,可以被差别中央处置器(CPU)接见的大容量内存,也可以由差别历程共享,是非常快的历程通讯方式。

 

然则使用共享内存也有欠好的地方,就是对于多机械时数据欠好统一。

nginx一招配置,帮你快速隐藏php后缀名

 

shell下令ipcs可用来显示系统下共享内存的状态,函数shmget可以确立或打开一块共享内存区,函数shmat将一个存在的共享内存段毗邻到本历程空间, 函数shmctl可以对共享内存段举行多种操作,函数shmdt函数星散该共享内存。

 

3. 思量使用持久毗邻

持久毗邻也为长毗邻,它自己是TCP通讯的一种通俗方式,即在一次TCP毗邻中连续发送多分数据而不停开毗邻。

 

与它相反的方式称为短毗邻,也就是确立毗邻后发送一份数据就断开,然后再次确立毗邻发送下一份数据, 周而复始。

 

是否接纳持久毗邻,完全取决于应用特点。

 

从性能角度看,确立TCP毗邻的操作自己是一项不小的开销,在允许的情况下,毗邻次数越少,越有利于性能的提升; 尤其对于密集型的图片或网页等小数据请求处置有显著的加速所用。

 

HTTP长毗邻需要浏览器和web服务器的配合协作,现在浏览器普遍支持长毗邻,显示在其发出的HTTP请求数据头中包罗关于长毗邻的声明,如下:Connection: Keep-Alive

 

主流的web服务器都支持长毗邻,好比apache中,可以用KeepAlive off关闭长毗邻。

 

对于长毗邻的有用使用,另有要害一点在于长毗邻超时时间的设置,即长毗邻在什么时刻关闭吗?

 

Apache的默认设置为5s, 若这个时间设置过长,则可能导致资源无效占有,维持大量空闲历程,影响服务器性能。

 

4. 改善I/O 模子

I/O操作凭据装备的差别分为许多类型,好比内存I/O, 网络I/O, 磁盘I/O

 

对于网络I/O和磁盘I/O, 它们的速率要慢许多,只管使用RAID磁盘阵列可通过并行磁盘磁盘来加速磁盘I/O速率,购置大连独享网络带宽以及使用高带宽网络适配器可以提高网络I/O的速率。

 

但这些I/O操作需要内核系统挪用来完成,这些需要CPU来调剂,这使得CPU不得不虚耗名贵的时间来守候慢速I/O操作。

 

我们希望让CPU足够少的时间在i/O操作的调剂上,若何让高速的CPU和慢速的I/O装备更好地协调事情,是现代盘算机一直探讨的话题。种种I/O模子的本质区别在于CPU的介入方式。

 

DMA手艺

I/O装备和内存之间的数据传输方式由DMA控制器完成。在DMA模式下,CPU只需向DMA下达下令,让DMA控制器来处置数据的传送,这样可以大大节约系统资源。

 

异步I/O

异步I/O指自动请求数据后便可以继续处置其它义务,随后守候I/O操作的通知,这样历程在数据读写时不发生壅闭。

 

异步I/O是非壅闭的,当函数返回时,真正的I/O传输已经完成,这让CPU处置和I/O操作到达很好的重叠。

 

I/O多路复用

epoll服务器同时处置大量的文件形貌符是必不可少的,若接纳同步非壅闭I/O模子,若同时吸收TCP毗邻的数据,就必须轮流对每个socket挪用吸收数据的方式,不管这些socket有没有可吸收的数据,都要询问一次。

 

如果大部门socket并没有数据可以吸收,那么历程便会虚耗许多CPU时间用于检查这些socket有没有可以吸收的数据。

 

多路I/O停当通知的泛起,提供了对大量文件形貌符停当检查的高性能方案,它允许历程通过一种方式同时监视所有文件形貌符,并可以快速获得所有停当的文件形貌符,然后只针对这些文件形貌符举行数据接见。

 

epoll可以同时支持水平触发和边缘触发,理论上边缘触发性能更高,然则代码实现庞大,由于任何意外的丢失事宜都市造成请求处置错误。

 

epoll主要有2大改善:

  1. epoll只见告停当的文件形貌符,而且当挪用epoll_wait()获得文件形貌符时,返回并不是现实的形貌符,而是一个代表停当形貌符数目的值,然后只需去epoll指定的一个数组中依次取得响应数目的文件形貌符即可。这里使用了内存映射(mmap)手艺,这样彻底省掉了这些文件形貌符在系统挪用时复制的开销。
  2. epoll接纳基于事宜的停当通知方式。其事先通过epoll_ctrl()注册每一个文件形貌符,一旦某个文件形貌符停当时,内核会接纳类似callback的回调机制,当历程挪用epoll_wait()时获得通知

 

关于IO模子,可以参考笔者前面写的相关文章JAVA NIO.2;关于epoll,可以参考笔者前面写的文章select、poll和epoll简介。

 

Sendfile

大多数时刻,我们都向服务器请求静态文件,好比图片,样式表等。

 

在处置这些请求时,磁盘文件的数据先经由内核缓冲区,然后到用户内存空间,不需经由任何处置,其又被送到网卡对应的内核缓冲区,接着再被送入网卡举行发送。

 

linux提供sendfile()系统挪用,可以讲磁盘文件的特定部门直接传送到代表客户端的socket形貌符,加速了静态文件的请求速率,同时削减CPU和内存的开销。

 

适用场景:对于请求较小的静态文件,sendfile施展的作用不那么显著,因发送数据的环节在整个过程中所占时间的比例相比于大文件请求时小许多。

 

内存映射

Linux内核提供一种接见磁盘文件的特殊方式,它可以将内存中某块地址空间和我们指定的磁盘文件相关联,从而对这块内存的接见转换为对磁盘文件的接见。这种手艺称为内存映射

 

多数情况下,内存映射可以提高磁盘I/O的性能,无须使用read()或write()等系统挪用来接见文件,而是通过mmap()系统挪用来确立内存和磁盘文件的关联,然后像接见内存一样自由接见文件。

 

瑕玷:在处置较大文件时,内存映射会导致较大的内存开销,得不偿失。

 

直接I/O

在linux 2.6中,内存映射和直接接见文件没有本质差异,由于数据需要经由2次复制,即在磁盘与内核缓冲区之间以及在内核缓冲区与用户态内存空间。

 

引入内核缓冲区的目的在于提高磁盘文件的接见性能,然而对于一些庞大的应用,好比数据库服务器,它们为了进一步提高性能,希望绕过内核缓冲区,由自己在用户态空间实现并治理I/O缓冲区,好比数据库可凭据加倍合理的计谋来提高查询缓存命中率。

 

另一方面,绕过内核缓冲区也可以削减系统内存的开销,因内核缓冲区自己就在使用系统内存。

 

Linux在open()系统挪用中增添参数选项O_DIRECT,即可绕过内核缓冲区直接接见文件,实现直接I/O。

 

在MySQL中,对于Innodb存储引擎,自身举行数据和索引的缓存治理,可在my.cnf设置中分配raw分区跳过内核缓冲区,实现直接I/O。

 

5. 改善服务器并发计谋

服务器并发计谋的目的,是让I/O操作和CPU盘算只管重叠举行,一方面让CPU在I/O守候时不要空闲,另一方面让CPU在I/O调剂上只管花最少的时间。

 

一个历程处置一个毗邻,非壅闭I/O

这样会存在多个并发请求同时到达时,服务器一定要准备多个历程来处置请求。其历程的开销限制了它的并发毗邻数。

 

但从稳定性和兼容性的角度,则其相对平安,任何一个子历程的溃逃不会影响服务器自己,父历程可以确立新的子历程;这种计谋典型的例子就是Apache的fork和prefork模式。

 

对于并发数不高(如150以内)的站点同时依赖Apache其它功效时的应用选择Apache照样可以的。

 

一个线程处置一个毗邻,非壅闭IO

这种方式允许在一个历程中通过多个线程来处置多个毗邻,一个线程处置一个毗邻。Apache的worker模式就是这种典型例子,使其可支持更多的并发毗邻。不外这种模式的总体性能还不如prefork,以是一样平常不选用worker模式。

 

一个历程处置多个毗邻,异步I/O

一个线程同时处置多个毗邻,潜在的条件条件就是使用IO多路复用停当通知。

 

这种情况下,将处置多个毗邻的历程叫做worker历程或服务历程。worker的数目可以设置,如Nginx中的worker_processes 4。

 

一个线程处置多个毗邻,异步IO

纵然有高性能的IO多路复用停当通知,但磁盘IO的守候照样无法制止的。加倍高效的方式是对磁盘文件使用异步IO,现在很少有Web服务器真正意义上支持这种异步IO。

 

6. 改善硬件环境

另有一点要提及的是硬件环境,服务器的硬件设置对应用程序的性能提升往往是最直接,也是最简朴的方式,这就是所谓的scale up。这里不做叙述。

Linux安装nfs文件服务器

分享到 :
相关推荐

发表评论

登录... 后才能评论