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

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

1.池

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

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

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

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

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

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

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

2.数据复制

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

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

3.上下文切换和锁

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

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

提升服务器性能的建议相关推荐

  1. 虚拟化 提升服务器性能,虚拟化性能提升

    虚拟化性能提升 每一代新的至强芯片都会减少虚拟机的进入(VMentry)和退出 (VMexit)操作周期,但还有一种降低硬件虚拟化资源代价的方法就是尽量避免VMexits.其中导致VMexits和VM ...

  2. 10 条提升 Android 性能的建议

    About the Speaker: Boris Farber 每个人都知道一个 App 的成功,更这个 App 的性能体验有着很密切的关系.但是如何让你的 App 拥有极致性能体验呢?在 Droid ...

  3. web提升服务器性能,开启一个参数就能让你的WEB性能提升3倍

    一.遇到的一些问题 记得 2008 年做性能测试的时候,新进7台 lenovo 4核4G 服务器用于性能测试. 当时资源紧张,这7台服务器都装了双系统(Win2003/CentOS5)空闲时用于做测试 ...

  4. Nginx反向代理为什么能够提升服务器性能?

    对于后端是动态服务来说,比如 Java 和 PHP.这类服务器(如 JBoss 和 PHP-FPM)的 IO 处理能力往往不高.  Nginx 有个好处是它会把 Request 在读取完整之前 buf ...

  5. 简单有效提升服务器性能,4个简单操作,让你的服务器性能飞速提升!

    原标题:4个简单操作,让你的服务器性能飞速提升! 服务器在网站运行方面起着至关重要的作用,性能强大与否是站长必须关心的事,而如何提升服务器性能也是站长需要关注的. 一.增加内存容量 运行速度下降很可能 ...

  6. 12个提升PostgreSQL_TSDB 插入性能的建议

    作者: 北枫 本文将分别从以下两个方面给出提升插入性能的建议: 一提升PostgreSQL性能 二选择并配置TSDB以获得更好的插入性能 其中一些方法可能会让您感到比较新奇,但所有十二种方法都将帮助您 ...

  7. 华为性能服务器,服务器 性能

    服务器 性能 内容精选 换一换 对于不同的硬件设备,通过在BIOS中设置一些高级选项,可以有效提升服务器性能.服务器上的SMMU一般用来完成设备的地址转换,并且可以实现设备隔离,在虚拟化中很实用,但是 ...

  8. 服务器性能测试方法,服务器性能测试方法

    服务器性能测试方法 内容精选 换一换 登录Windows云服务器时,系统报错,错误代码为"0x112f",如图1所示.云服务器内存不足.方法一(推荐):变更规格,升级云服务器的CP ...

  9. 《高性能MySQL》——服务器性能剖析(笔记)

    文章目录 三.服务器性能剖析 3.1 性能优化简介 3.1.1 通过性能剖析进行优化 3.1.2 理解性能剖析 3.2 对应用程序进行性能剖析 3.3 剖析MySQL查询 3.3.1 剖析服务器负载 ...

最新文章

  1. SQL Server 中print Datetime类型问题
  2. 视频直播技术详解(2)采集
  3. Selector选择器概述||Selector选择器组合使用
  4. Graph Coloring I
  5. java ee cdi_Java EE CDI限定词:快速浏览
  6. oracle查询表的id,oracle 查看所有用户及密码 实现Oracle查询用户所有表
  7. Centos 下面升级系统内核(转)
  8. mysql日志种类、二进制日志模式、mysqlbinlog解析二进制日志
  9. 国科大prml10-无监督学习
  10. Boost学习之正则表达式--regex
  11. 竟然有一半的人不知道 for 与 foreach 的区别???
  12. c++ 十进制、十六进制和BCD的相互转换
  13. 20200224:跳跃游戏(leetcode55)
  14. scala 基础 ——关键字与特殊符号
  15. linux操作系统结构体系,Linux操作系统结构分析 郭玉东.pdf
  16. shiro 原理简介
  17. Windows XP几个版本的区分
  18. FinTech4Good创始人张晓晨:全球区块链的产业应用趋势
  19. 数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图
  20. linux 转型 安卓,国内知名Linux网站Linux公社和红联都转型为Android安卓网站

热门文章

  1. java get cookies_Java Cookie.getDomain方法代码示例
  2. django开发中安装包时遇到的 关于 read timed out的问题的解决
  3. Advanced Science|北京大学第一医院肾脏内科杨莉团队与白凡研究组揭示急性肾损伤中始动和放大炎症巨噬细胞新亚群...
  4. 转载---Adaboost学习记录
  5. 如何在 Mac 上将 JPG图像合并为一个PDF
  6. manga camera android,Manga-Camera
  7. atom对比 vscode_VS Code、ATOM这些开源文本编辑器的代码实现中有哪些奇技淫巧?...
  8. littlevgl 透明按钮_张家港3-10吨叉车日租价格透明2020
  9. js实时获取窗口大小变化
  10. 使用outputstream写到指定位置_MaxCompute Spark与Spark SQL对比分析及使用注意事项