如何优化服务器的性能

一、通常服务器的性能会卡在三个地方:

  • cpu
  • 网络IO
  • 磁盘IO

二、在优化性能的时候,首先要判断性能的瓶颈在上述的哪个地方。然后对症下药,按照下面的方法来优化:

1、提高CPU性能的方法

  • 并发。利用多线程、进程。老的线程库效率太低,需要升级用nptl 。进(线)程数不要大于cpu个数 (请参考:http://www.ibm.com/developerworks/cn/linux/l-threading.html
  • 谨慎用锁。改善架构,尽量不用锁。
  • 慎用字符串操作,比如sprintf,snprintf,因为%d %s等等都需要CPU资源去做词法分析,数量多的话,也是不菲的开销
  • 减少系统调用,例如time,主要消耗在用户态和内核态之间的切换。
  • 减少遍历操作。
  • 把握真实需求,简化实现方案
  • 优化架构,字符串协议解包很耗cpu,考虑单独一个线程

一个好的架构,服务器的CPU总消耗总是平均的分布在各个cpu上,CPU的消耗在70%左右

2、提高网络IO的方法

  • 使用epoll代替select
  • 使用非阻塞的模式来开发

3、提高磁盘IO的方法

【详细请参看另一篇博文:linux下提高磁盘IO的方法】

(http://www.cnblogs.com/zackyang/archive/2010/02/08/1665768.html)

  • Linux可以利用空闲内存作文件系统访问的cache,因此系统内存越大存储系统的性能也越好
  • 利用顺序写,减少寻道次数
  • Cache策略,充分利用cpu和内存的资源来缓解磁盘读写压力

三、如何来寻找系统的瓶颈呢?可以利用下面的工具:

1、top

可以查看系统中运行的进程的状况,CPU使用状况,系统负载,内存使用等。它是检查系统进程运行状况最方便的工具了,它默认显示部分活动的进程,并且按照进程使用CPU的多少排序。它可以显示全部CPU的使用状况,也可以显示每个进程都运行在那个CPU上面。

主要可以用top来看哪些进程或者那类进程占用CPU和内存资源最多,以此迅速定位存在性能问题的进程,以及运行异常的进程

2、free

free命令显示系统内存的使用状况(物理内存和交换内存)通过这个命令我们可以看到系统进程实际使用的物理内存,buffer和cache使用的物理内存

3、vmstat

vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下问切换、CPU使用等。

  • Procs

r:运行的和等待(CPU时间片)运行的进程数,这个值也可以判断是否需要增加CPU(长期大于1) b:处于不可中断状态的进程数,常见的情况是由IO引起的

  • Memory 类似free命令
  • Swap

si: 交换内存使用,由磁盘调入内存 so: 交换内存使用,由内存调入磁盘

内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响。磁盘IO和CPU资源都会被消耗。

  • IO

bi: 从块设备读入的数据总量(读磁盘) (KB/s), bo: 写入到块设备的数据总理(写磁盘) (KB/s) 随机磁盘读写的时候,这2个 值越大,能看到CPU在IO等待的值也会越大

  • System

in: 每秒产生的中断次数 cs: 每秒产生的上下文切换次数 上面这2个值越大,会看到由内核消耗的CPU时间会越多

  • CPU

us: 用户进程消耗的CPU时间百分比 us 的值比较高时,说明用户进程消耗的CPU时间多 sy: 内核进程消耗的CPU时间百分比 sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性的表现,我们应该检查原因。 wa: IO等待消耗的CPU时间百分比 wa 的值高时,说明IO等待比较严重,这可能是由于磁盘大量作随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。 id: CPU处在空闲状态时间百分比

4、Strace

可以用来查看一个进程在执行过程中的系统调用和所接收的信号。

5、tcpdump

linux下的抓包工具。可以把抓下来的信息重定向到文件里。然后在windows下用ethereal来分析。很强大

6、gprof

  • 程序中每个函数的CPU使用时间。
  • 每个函数的调用次数。并提供简单调用关系图。

使用步骤:

  • 用gcc或g++编译程序时,使用-pg参数
  • 执行编译得到的运行程序,会产生一个gmon.out文件
  • 使用gprof命令。查看结果信息。(gprof -b proc_name gmon.out | less)

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

如何优化服务器的性能

一、通常服务器的性能会卡在三个地方: cpu 网络IO 磁盘IO 二、在优化性能的时候,首先要判断性能的瓶颈在上述的哪个地方。然后对症下药,按照下面的方法来优化...

44590
来自专栏沈唁志

ThinkPHP-PHP开发中的主流框架

92940
来自专栏安恒网络空间安全讲武堂

Python编写渗透工具学习笔记一 | 0x01 目录扫描程序

0x01web目录扫描程序 脚本利用演示 直接输入python DirScan.py会打印出使用说明信息 ? 然后扫描一下 ? 可以看到扫描出了我的服务器的这些...

49170
来自专栏Crossin的编程教室

Python 实战(1):在网页上显示信息

上次简单介绍了 web.py。今天先来粗略解释下那个 hello world 页面的代码: import web 导入 web.py 模块。 urls = ( ...

36570
来自专栏Java成神之路

Java微信开发_Exception_03_errcode:48001 errmsg:api unauthorized hint

异常信息:errcode:48001 errmsg:api unauthorized hint

14940
来自专栏代码世界

Python之IO模型

IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步、异步、阻塞、非阻塞     同步(synchronous) IO和异步(asynchronous...

460110
来自专栏1001482的专栏

大数据实时处理利器 storm 的 ui 解剖

众所周知,storm已经是业界主流的流时处理框架,Storm被广泛应用于实时分析,在线机器学习,持续计算、分布式远程调用等领域。

1.7K10
来自专栏云飞学编程

python爬虫零基础入门——反爬的简单说明

之前在《如何开始写你的第一个python脚本——简单爬虫入门!》中给大家分享了一下写一个爬虫脚本的基本步骤,今天继续分享给大家在初期遇到的一个很烦人的问题——反...

10330
来自专栏编程

Linux探秘之用户态与内核态

Unix/Linux的体系架构 ? 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——...

59790
来自专栏极客猴

pustil - 获取系统信息库

运维工程师经常使用 Python 编写脚本程序来做监控系统运行的状态。如果自己手动使用 Python 的标准库执行系统命令来获取信息,会显得非常麻烦。既要兼容不...

16710

扫码关注云+社区

领取腾讯云代金券