提升服务器性能的建议

性能对于服务器来说是至关重要的,毕竟每个活动都期望起请求能很快的得到响应.影响服务器性能的首要因素就是系统的硬件资源.比如CPU的个数 速度 内存的大小等.不过由于硬件技术的飞速发展,现代服务器都不缺反硬件资源,因此我们需要考虑的主要问题是如何从"软环境"来提升服务器的性能.服务器的"软环境",一方面是指系统的软件资源,比如操作系统允许用户打开的最大文件描述符数量;另一方面指的就是服务器程序本身,即如何从编程的调度确保服务器的性能.

下面我们进一步分析高性能服务器需要注意的其他几个方面:池 数据复制 上下文切换和锁.

1.池

既然服务器的硬件资源"充裕",那么提高服务器性能的一个很直接的方法就是以空间换时间,即浪费服务器的硬件资源以换取其运行效率.这就是池的概念.池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,这成为静态资源分配.当服务器进入正式运行阶段,即开始处理客户请求的时候,如果它需要相关的资源,就可以直接从池中获取,无须动态分配.很显然,直接从池中取得所需资源比动态分配资源的速度要快很多.因为分配系统资源的系统调用都是很耗时的.当服务器处理完一个客户连接后,可以吧相关的资源放回池中,无须执行系统调用来释放资源.从最终的效果来看,池相当于服务器管理系统资源的应用层设施,它避免了服务器对内核的频繁访问.

不过,既然池中的资源是预先静态分配的,我们就无法预期应该分配多少资源.这个问题又该如何解决?最简单的解决方法就是分配足够多的资源,即针对每个可能的客户连接都分配必要的资源,这通常会导致资源的浪费,因为任一时刻的客户数量都可能远远没有达到服务器能支持的最大客户数量.好在这种资源的浪费对于服务器来说不会构成问题.还有一种解决方法就是预先分配一定的资源,此后如果发现资源不够用,就再动态分配一些并加入翅中.

根据不同的资源类型,可以吧池分别多种.常见的有内存池,进程池,线程池和连接池.

内存池通常用于socket的接收缓存和发送缓存.对于某些长度优先的客户请求,比如http请求,预先分配一个大小足够的接收缓冲区是合理的.当客户请求的长度超过接收缓冲区的大小时,我们可以选择丢弃请求或动态扩大接收缓冲区.

进程池和线程池都是并发常用的.当我们需要一个工作线程或工作进程来处理新到来的客户请求时,我们可以直接从进程池和线程池取得一个执行实体,而无需动态调用fork或pthread_creat来创建进程和线程.

连接池通常用户服务器或服务器集群的内部永久连接.


在图8-4中,每个逻辑单元可能都需要平凡的访问本地的某个数据库.简单的做法:逻辑单元每次需要访问数据库的时候就想数据库程序发起连接,而访问完毕后释放连接.很显然,这样做法效率太低.一种解决方法就是使用连接池,连接池的服务器预先和数据库程序建立的一组连接的集合.当某个逻辑单元需要访问数据库时,它可以直接从连接池中取得一个连接的实体并使用之.待完成数据库的访问之后,逻辑单元再讲该链接返回给连接池.

2.数据复制

高性能服务器应该避免不必要的数据复制.尤其是当数据复制发送在用户代码和内核之间的时候.如果内核可以直接从socket或文件读取的时候,则应用程序就没必要从内核缓冲区复制到应用程序缓冲区.这里所的直接处理, 指的是应用程序不关心这些数据的内容,不需要对他们做任何分析.比如ftp服务器,当客户请求一个文件时,服务器只需要检测目标文件是否存在,以及用户是否有读取他的权限,而绝对不关心这个文件的具体内容.这样的话 ftp服务器无须吧目标文件的内容完整的读入到应用程序缓冲区中并调用send函数来发送,而是可以使用零拷贝函数(sendfile)来直接将其发送给客户端.

此外,用户代码内部(不可访问内核)的数据也是可以避免的,举例来说,当两个工作进程之间要传递大量的数据时,我们就应该考虑使用共享内存来在他们之间共享这些数据,而不是使用管道或者消息队列来传递.

3.上下文切换和锁

并发程序必须考虑上下文切换的问题,即进程切换和线程切换导致的系统开销.即使是IO密集型的服务器,也不该使用过多的工作线程,否则线程间的切换将占用大量的cpu时间.服务器真正用于处理业务逻辑的CPU时间的比重就显得不足了.因此为每个客户连接都创建一个工作线程的服务器是不可取的.


图8-11描述的半同步/半异步模式是一种比较合理的解决方案.它允许一个线程同时处理多个客户连接.此外,多线程服务器的一个优点是不同的线程可以同步运行在不同的CPU上,当线程的数量不大于CPU的数量是,上下文的切换就不是问题了.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值