linux系统调优基于什么

2015-07-03 00:36:03 ljianhui 阅读数 5498

本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.2节的翻译
原文地址:http://www.redbooks.ibm.com/redpapers/pdfs/redp4285.pdf
原文作者:Eduardo Ciliendo, Takechika Kunimasa, Byron Braswell


译文如下:

1.2 Linux内存架构

为了执行一个进程,Linux内核为请求的进程分配一部分内存区域。该进程使用该内存区域作为其工作区并执行请求的工作。它与你的申请一个办公桌,然后使用办公桌来摆放纸张、文档和备忘录来执行你的工作类似。不同之处是内核必须使用更动态的方式来分配内存空间。有时运行的进程数会达到数万个,但内存的数量是有限的。因此,Linux内核必须有效地处理内存。在本节,我们将会讲述Linux的内存结构、地址分布和Linux如何有效地管理内存空间。


1.2.1 物理和虚拟内存

今天我们已经要面对选择32位和64位系统的问题。对于企业级客户的其中一个最重要的不同是虚拟内存的地址是否能超过4GB。从性能的角度来看,理解32位和64位系统中Linux内核如何把物理内存映射到虚拟内核是重要的。


从图1-10中,可以看出Linux内核在处理32位和64位系统内存的方式上的明显的差别。介绍内存内存到虚拟内存的映射细节已经超出了本文的范围,所以本文着重介绍Linux内存结构的部分细节。


在32位的架构上,如IA-32,Linux内核只能直接访问物理内存的前1GB(当考虑部分保留是为896MB)。所谓的 ZONE_NORMAL之上的内存必须要被映射到1GB以上的内存中。该映射对于应用来说是完全透明的,但是在ZONE_HIGHMEM中申请内存页会导致一个性能的稍微下降。


另一方面,在64位的架构上,如x86-64(也叫x64),ZONE_HIGHMEM可以一直延伸到64GB,或者在IA-64系统上可以延伸到128GB。正如你所见到的,通过64位的架构,内存页从ZONE_HIGHMEM到ZONE_NORMAL的映射开销可以被消除。


图1-10 32位和64位系统的Linux内核内存布局


虚拟内存地址布局
图1-11展示了32位和64位架构的Linux虚拟地址布局。


在32位架构上,一个进程能访问的最大的地址空间为4GB。这是32位虚拟地址的一个限制。在标准的实现里,虚拟地址空间被分为3GB的用户空间和1GB的内核空间。这有一点类似于4G/4G寻址布局实现的变种。


另一方面,在64位架构中,如x86-64和IA64,没有此限制。每个单独进程都能得益于于广阔而巨大的地址空间。


图1-11 32位和64位架构的虚拟内存地址布局


1.2.2 虚拟内存管理
操作系统的物理内存架构对于应用和用户来说通常是不可见的,因为操作系统会把任何的物理内存都映射到虚拟内存中。如果我们想要理解在Linux操作系统中的调优的可能性,我们必须理解Linux如何处理虚拟内存。正如1.2.1中“物理内存和虚拟内存”的介绍,应用并不能申请物理内存,但当向Linux内核请求一定大小的内存映射,得到的是一个虚拟内存的映射。如图1-12所示,虚拟内存不一定要映射到物理内存中。如果你的应用申请了大量的内存,这些内存中的一部分可能映射到磁盘的swap文件中。


图1-12展示了,应用程序通常直接写不直接写磁盘,而是直接写缓存(cache)或缓冲(buffer)。当pdflush内核线程空闲或者文件大小超出了缓存缓冲大小时,pdfflush内核线程会将缓存/缓冲的数据清空并写入到磁盘中。参阅“清空脏缓冲”。


图1-12 Linux虚拟内存管理


Linux内核处理物理磁盘的写操作与Linux管理磁盘缓存紧密相连。其他的操作系统只分配部分内存作为磁盘缓存,而Linux处理内存资源则更加有效。默认的虚拟内存管理配置分配所有可用的空闲内存作为磁盘的缓存。因此在拥有大量内存的Linux系统中,经常看到只有20MB的空闲内存。


在相同的情况下,Linux管理swap空间也非常有效率。swap空间被使用时并不意味着出现内存的瓶颈,它恰恰证明了Linux管理系统资源如何的有效。详见“页帧回收”。


页帧的分配
一页是一组连续线性的物理内存(页帧)或虚拟内存。Linux内核以页为单位管理内存。一页的大小通常为4K字节。当一个进程申请一定数量的页时,如果可用的页足够,Linux内核马上分配给进程。否则,内存页必须从其他一些进程或内存页缓存中获取。Linux内存知道可用的内存页的数量及位置。


伙伴系统
Linux内核通过一种被称作伙伴系统的机制管理空闲页。伙伴系统管理空闲页并尽力为分配请求分配页。它尽最大努力保持内存区域的连续。如果不考虑分散的小页,将会导致内存碎片,并导致在连续区域内申请一大段的页变得困难。它将导致效率低下的内存使用和性能下降。


图1-13说明了伙伴系统如何分配页。


图1-13 伙伴系统


当尝试分配页失败,页回收会被激活。参阅“页帧回收”。


你可以通过/proc/buddyinfo查找伙伴系统的信息。详见“Memory used in a zone”。


页帧回收
当一个进程请求一定数量的页的映射时,如果页不可用,Linux内核新的请求尝试通过释放某些页(先前使用过但现在不再使用,但基于某些原则仍然被标记为活动状态的页)并分配内存给该进程。这个过程被称为面帧回收。kswapd内核线程和try_to_free_page()内核函数被用来负责页的回收。


kswapd线程通常处于可中断的睡眠状态,当某一区域中的自由页低于一个阈值时,kswapd线程会被伙伴系统调用。它尝试基于最近最少使用算法从活动页中找出候选页。最近最少使用的页将会被首先释放。活动列表和非活动列表被用于维护候选页。kswapd扫描部分活动列表并检查页的使用情况,把最近没有使用的页放到非活动列表中。你可以使用vmstat -a命令查看哪些内存是活动的和哪些内存是非活动的。


kswapd也遵循其他原则。页的使用主要是为了两个用途:页缓存和进程地址空间。页缓存是页映射到一个磁盘文件。属于一个进程地址空间的页(被称为匿名内存,因为它没有映射到任何文件,也没有名字)被用于堆和栈。参阅1.1.8,“进程内存段”。当kswapd回收页时,它将会尽量压缩页缓存而不是把进程的页page out(或者swap out)。


Page outswap out:“page out”和“swap out”很多时候都会被混淆。“page out”是指把页(整个地址空间的一部分)放到swap区,而“swap out”是指把整个地址空间放到swap区。但是它们有时候可以交换使用。


大部分被回收和进程地址空间的页缓存的回收取决于其使用场景,并将对性能产生影响。你可以通过使用/proc/sys/vm/swappiness对该行为进行一些控制。


swap(交换区)
如前所述,当页回收发生时,在非活动列表中属于该进程地址空间的候选页将会被page out。发生交换本身并不意味着发生了什么状况。虽然在其他系统中,swap只不过是万一发生了主要内存的过度分配的一种保障,但是Linux更有效地使用swap空间。如图1-12所示,虚拟内存由物理内存和磁盘或者swap分区共同组成。在Linux的虚拟内存管理的实现中,如果一个内存页已经被分配,但是在一段时间内都没有被使用,Linux会把该内存页移动至swap空间中。


你经常可以看到如getty的守护进程,它们通常当系统启动时被启动,但几乎不被使用。释放页所占的珍贵的主内存并把它移至交换区似乎是更加高效的。这正是Linux管理swap的方式,因此当你发现交换区已经使用了50%并不需要惊慌。事实上,swap空间开始被使用并不意味着内存瓶颈;相反地,它证明了Linux如何高效地管理系统资源。


2018-11-27 10:39:25 huapeng_guo 阅读数 134

在很久以前,就对性能调优有非常浓厚的兴趣。虽然之前也在做过一些性能调优的工作,但是主要集中在代码层面,以及业务层面。对如何从Linux操作系统方面进行调优,一直都没有一个清晰的认识。不过,最近偶然发现了一本IBM出的Linux调优指南,于是就拜读了一下。

读完一些之后,就发现这本书确实就是我所需要的一本书。

虽然之前读过一些关于操作系统的书籍,但是并不懂如何把它们应用到性能调优中。而从网上看到的一些关于性能调优的文章,也主要是集中在检测并发现性能瓶颈这些我们早就清楚的内容。对于发现瓶颈之后,如何调优,从哪些方面进行调优,这背后的原理是什么,为什么要这么调优,却没有详细的说明。

而这本书恰恰弥补了这个空缺。弥补了操作系统高层理论以及底层调优之间的空缺。我们熟悉的操作系统,以及计算机网络,他们的处理过程,都是一些可以优化的点。

这本书,其实称为指南更合适。从CPU,内存,IO,计算机网络等方面,一一为我们展示了优化的过程。

这本指南也不厚,大概只有160页。内容不多,非常精简。同时也造成了一个缺点,就是,很多内容并不能全面铺开。

但是感觉用这本指南来进入性能调优的世界,还是绰绰有余的。

这本指南的名称是,《Linux Performance and Tuning Guidelines》

这篇文章,便是我在读完这本指南的时候,摘录的一些笔记。

CPU方面

处理器指标

  • CPU使用率: 每个处理器的利用率
  • user time: CPU执行用户代码的时间,包括nice time
  • system time: CPU执行内核代码的时间,包括IRQ和softirq time
  • waiting: CPU等待IO的时间
  • Idle time: CPU空闲并等待任务的时间
  • nice time: CPU花在改变进程优先级以及执行顺序的时间
  • load average: 任务队列中,等待被CPU执行的任务的总数,以及那些等待不可中断任务完成的任务的总数,它们的平均值。也就是,系统中处于TASK_RUNNABLE以及TASK_UNINTERRUPTIBLE状态的任务的总数的平均值。
  • Runnable process: 等待被CPU执行的任务的总数
  • Blocked: 那些因为IO操作被挂起的进程的数量
  • Context switch: 系统中线程切换的总数。
  • Interrupt: 硬中断和软中断的次数。

消除CPU瓶颈的方法

  • 确保后台没有不必要的程序
  • 给那些不重要并且是CPU密集型的应用调整优先级,让其优先级相对较低一些
  • 更新CPU

内存方面

内存指标

  • Free memory: 空闲内存。在Linux中,内核会将没有使用的内存中的大部分分配给文件系统缓存。所以,Free memory减去buffers以及cache占用的内存的数量,才是系统中真正的空闲内存的数量。
  • swap usage: swap in/out衡量内存是否出现了瓶颈才更加正确。因为Linux内核如果发现内存中的一些page,长时间没有被用到,就回将它放到swap中。而并不是说,只有当内存不足的时候,才会将page放到swap中。如果每秒有200-300次 swap in/out,那么说明系统的内存可能是瓶颈。
  • Buffer and cache: 为文件系统和block size分配的缓存
  • slab: 内核使用的内存数量。需要注意的是,内核使用的page不能被page out到磁盘中
  • active versus inactive memory: inactive memory将会被kswapd daemon swap out到磁盘中。

free工具输出解释

0.png

消除内存瓶颈的方法

  • 调整page的大小
  • 调整处理active和inactive内存的方式
  • 降低page-out的速度
  • 限制服务器上每个用户能够使用的内存的数量
  • 停止不需要的service
  • 增加内存

文件系统方面

文件系统指标

  • IOWait: CPU等待IO操作的时间
  • Average queue length: 未完成的IO请求的数量
  • Average wait: IO请求等待被处理的时间,毫秒级
  • Transfers per second: 每秒有多少IO操作被执行
  • Blocks read/write per seconds: 每秒中读和写block的数量。在2.6版本的内核中,以block大小为1KB衡量。不同的内核版本中,block大小不同,从512bytes到4KB不等
  • Kilobytes per second read/write: 每秒读写block device的数据量,用kilobytes来衡量

Linux中常见的文件系统

  • Ext2
  • Ext3
  • ReiserFS
  • Journal File System(JFS)
  • XFS

其中,Ext3能够保证数据的一致性。而且,还能够通过配置journal mode,在数据的完整性和速度之间取得一个较好的平衡。

而JFS和XFS,主要用在需要支持大文件的场景中。

消除文件系统瓶颈的方法

  • 如果程序访问磁盘的方式是顺序访问,那么就换一个更好的磁盘控制器。如果是随机访问的,那么就增加更多的磁盘控制器
  • 使用RAID。RAID的读性能比较高,但是写性能低一些。而且,优先使用基于硬件实现的RAID。
  • 给磁盘合理分区
  • 增加内存
  • 通过/proc/sys/vm/dirty_background_ratio来调整内存中有多少脏数据时,pdflush daemon才将这些数据写入到磁盘
  • 通过ionice来分配IO操作的优先级:
    • idle: 最低的优先级,只有当没有高优先级的进程访问磁盘时,才有资格访问磁盘
    • Best-effort: 默认优先级。从CPU优先级中继承
    • Real time: 最高的优先级。进程总是能够访问磁盘。
  • 禁止access time updates
  • 选择合适的文件系统,以及合适的journal模式
  • 调整block size:
    如果你的服务器,更多的是处理小的文件,那么将block size调小一点,可能会提高性能。但是如果处理大文件更多,那么调大一点可能会提高性能。但是这一项对性能提升并不大,所以,默认使用操作系统的4k的block size就好。

网络方面

网络指标

  • Packets received and sent
  • Bytes received and sent
  • Collisions per second: 网络中发生的碰撞数量。一个配置正确的网络中,应当很少发生碰撞
  • Packet dropped: 被丢弃的包的数量。包括被防火墙过滤掉的,以及由于buffer空间不够而丢掉的
  • Overruns: buffer空间溢出的次数
  • Errors: 出错的包的数量

数据传输的过程

  • 应用程序开启一个Socket并将数据写入到这个Socket的buffer中
  • 数据经过TCP/IP协议栈一层层地做一些处理,包装。数据并不会层层复制,因为这样性能不好。在内核中,只是修改buffer中的引用,将其传递给下一层
  • 数据通过网络到达另一台主机,我们暂且称它为主机B
  • 如果这个包的MAC地址就是主机B,那么把它放到主机B的socket buffer中
  • 主机B给CPU发出一个硬中断
  • 主机B再将数据通过TCP/IP协议栈的层层处理,传递给应用层

Linux中的协议栈,更注重的是可靠性和低延迟,而不是低开销和高吞吐量。

由于每一个数据包都会引发一次中断,所以,Linux中引入了一项叫做NAPI的技术。当第一个数据包到来时,还是跟之前一样,会引发一次中断。但是从此之后,网络接口会启动轮训模式,即,当有数据包到达时,不会发出中断,而是直到buffer都满了的时候,才发出一个中断。这样就能减少中断的次数。

TCP/IP传输窗口

TCP/IP传输窗口指的是,在收到ACK响应之前,最多能够发送的数据量。接收主机会通过TCP首部中的window size字段告诉发送主机传输窗口的大小。通过使用传输窗口,TCP能够处理地效率更高一些,因为发送主机不需要等待每一个数据包的ACK。

高速网络中,可以使用一种叫做窗口伸缩的技术,来增加传输窗口的大小。

Offload

如果你的网络适配器支持offload功能,那么你可以内核就可以将一部分工作转移到网络适配器,来减少CPU的工作量,进而提高性能。

常见的offload功能有:

  • Checksum Offload: 每一个数据包中,都会有一个校验码,用于验证这个数据包是否在传输过程中出现了问题
  • TCP segmentation offload: 当要传输的数据量大于MTU的时候,就要对数据进行分段处理。

消除网络瓶颈的方法

  • 确保网卡的配置和路由器以及交换机的配置配套
  • 调整网络的拓扑结构
  • 使用更快的网卡
  • 在内核中调整关于网络的参数
    • MTU
    • 接收和发送缓冲区的大小
    • 传输窗口
    • 通过调整net.ipv4.tcp_tw_reuse参数让处于TIME_WAIT状态的Socket对新连接可重用
    • 通过调整tcp_fin_timeout参数,让处于FIN-WAIT-2状态的Socket可以早一些关闭,进而节省内存
    • 通过调整tcp_keepalive_time参数,调整keepalive连接的关闭时间
    • 通过调整tcp_max_syn_backlog参数来调整最大能够容纳的处于半连接状态的socket的数量
  • 关闭一些不需要的服务,以及端口号

Linux的工具

性能监控工具

  • top
  • vmstat
  • uptime, w
  • ps, pstree
  • free
  • iostat
  • sar
  • mpstat
  • numastat
  • pmap
  • netstat
  • iptraf
  • tcpdump, etheral
  • nmon
  • strace
  • proc file system
  • KDE System guard
  • Gnome System Monitor

分析工具

  • lmbench
  • iozone
  • netperf

/proc

/proc目录中的内容,对于查看系统状态,应用程序的状态至关重要。

/proc目录中,又有这么几块:

  • 名称为数字的目录:每一个这样的目录,里面都包含了pid为这个数字的对应的进程的信息,比如,进程使用的虚拟内存
  • acpi: ACPI中包含一些高级配置,以及电源管理等信息。因为ACPI主要是用在笔记本,或者个人PC中,所以,在服务器上,一般是禁用的
  • bus: 包含了一些和bus相关的信息,比如PCI bus或者USB接口
  • irq: 包含和中断相关的信息。每个子目录都对应一种中断。我们可以通过直接修改对应子目录的信息,来将中断绑定到一个CPU上
  • net: 包含和网络相关的统计信息
  • scsi: 包含和SCSI相关的信息
  • sys: 包含和内核相关的参数
  • tty: 包含和tty相关的信息

从安装Linux就开始调优

考虑下面几个问题:

  • 安装什么版本的Linux?
    • 商业版的还是开源版本的?
    • 选择商业版的哪一个版本?
  • 选择正确的内核
    有这么几种内核。
    • standard: 应用在单处理器上
    • SMP: 支持SMP以及超线程技术。一些实现也支持NUMA.
    • Xen: 包括一个可以在Xen虚拟机上运行的Linux版本
  • 如何给磁盘分区?
    尽可能使用交换分区而不是交换文件。交换分区相对于交换文件来讲,没有文件系统上的开销。
  • 使用什么文件系统?
  • 安装时,尽可能少安装包还是安装全部的包?
  • 防火墙配置
  • SELinux
  • Runlevel选择
    除非有特别需求,否则服务器上都是使用runlevel 3.



作者:AlstonWilliams
链接:https://www.jianshu.com/p/1dfcd9e925a6
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

2019-06-05 11:33:19 PPCTC 阅读数 833

Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台,在这个平台下有无数的开源软件支撑,我们常见的apache、tomcat、mysql、php等等,开源软件的最大理念是自由、开放,那么linux作为一个开源平台,最终要实现的是通过这些开源软件的支持,以最低廉的成本,达到应用最优的性能。因此,谈到性能问题,主要实现的是linux操作系统和应用程序的最佳结合。

一、性能问题综述

系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在linux上搭建了一个web服务,经常出现网页无法打开、打开速度慢等现象,而遇到这些问题,就有人会抱怨linux系统不好,其实这些都是表面现象。操作系统完成一个任务时,与系统自身设置、网络拓朴结构、路由设备、路由策略、接入设备、物理线路等多个方面都密切相关,任何一个环节出现问题,都会影响整个系统的性能。因此当linux应用出现问题时,应当从应用程序、操作系统、服务器硬件、网络环境等方面综合排查,定位问题出现在哪个部分,然后集中解决。

在应用程序、操作系统、服务器硬件、网络环境等方面,影响性能最大的是应用程序和操作系统两个方面,因为这两个方面出现的问题不易察觉,隐蔽性很强。而硬件、网络方面只要出现问题,一般都能马上定位。下面主要讲解操作系统方面的性能调优思路,应用程序方面需要具体问题具体对待。

以下从影响Linux性能的因素、分析性能涉及的人员、系统性能优化工具、系统性能评价标准四个方面介绍优化Linux的一般思路和方法。

二、影响Linux性能的因素

2.1系统硬件资源

1.CPU

CPU是操作系统稳定运行的根本,CPU的速度与性能在很大程度上决定了系统整体的性能,因此,CPU数量越多、主频越高,服务器性能也就相对越好。但事实并非完全如此。

目前大部分CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因此,可以利用处理器的超线程特性提高系统性能。在Linux系统下,只有运行SMP内核才能支持超线程,但是,安装的CPU数量越多,从超线程获得的性能方面的提高就越少。另外,Linux内核会把多核的处理器当作多个单独的CPU来识别,例如两个4核的CPU,在Lnux系统下会被当作8个单核CPU。但是从性能角度来讲,两个4核的CPU和8个单核的CPU并不完全等价,根据权威部门得出的测试结论,前者的整体性能要比后者低25%~30%。

可能出现CPU瓶颈的应用有db服务器、动态Web服务器等,对于这类应用,要把CPU的配置和性能放在主要位置。

2.内存

内存的大小也是影响Linux性能的一个重要的因素,内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,导致资源浪费。Linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要足够大;但是过大的物理内存,会造成内存资源浪费,例如,在一个32位处理器的Linux操作系统上,超过8GB的物理内存都将被浪费。因此,要使用更大的内存,建议安装64位的操作系统,同时开启Linux的大内存内核支持。

由于处理器寻址范围的限制,在32位Linux操作系统上,应用程序单个进程最大只能使用4GB的内存,这样以来,即使系统有更大的内存,应用程序也无法“享”用,解决的办法就是使用64位处理器,安装64位操作系统。在64位操作系统下,可以满足所有应用程序对内存的使用需求 ,几乎没有限制。

可能出现内存性能瓶颈的应用有NOSQL服务器、数据库服务器、缓存服务器等,对于这类应用要把内存大小放在主要位置。

3.磁盘I/O性能

磁盘的I/O性能直接影响应用程序的性能,在一个有频繁读写的应用中,如果磁盘I/O性能得不到满足,就会导致应用停滞。好在现今的磁盘都采用了很多方法来提高I/O性能,比如常见的磁盘RAID技术。

通过RAID技术组成的磁盘组,就相当于一个大硬盘,用户可以对它进行分区格式化、建立文件系统等操作,跟单个物理硬盘一模一样,唯一不同的是RAID磁盘组的I/O性能比单个硬盘要高很多,同时在数据的安全性也有很大提升。

根据磁盘组合方式的不同,RAID可以分为RAID0,RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+1、RAID10等级别,常用的RAID级别有RAID0、RAID1、RAID5、RAID0+1,这里进行简单介绍。

  • ? RAID0:通过把多块硬盘粘合成一个容量更大的硬盘组,提高了磁盘的性能和吞吐量。这种方式成本低,要求至少两个磁盘,但是没有容错和数据修复功能,因而只能用在对数据安全性要求不高的环境中。
  • ? RAID1:也就是磁盘镜像,通过把一个磁盘的数据镜像到另一个磁盘上,最大限度地保证磁盘数据的可靠性和可修复性,具有很高的数据冗余能力,但磁盘利用率只有50%,因而,成本最高,多用在保存重要数据的场合。
  • ?RAID5:采用了磁盘分段加奇偶校验技术,从而提高了系统可靠性,RAID5读出效率很高,写入效率一般,至少需要3块盘。允许一块磁盘故障,而不影响数据的可用性。
  • ?RAID0+1:把RAID0和RAID1技术结合起来就成了RAID0+1,至少需要4个硬盘。此种方式的数据除分布在多个盘上外,每个盘都有其镜像盘,提供全冗余能力,同时允许一个磁盘故障,而不影响数据可用性,并具有快速读/写能力。
    通过了解各个RAID级别的性能,可以根据应用的不同特性,选择适合自身的RAID级别,从而保证应用程序在磁盘方面达到最优性能。

4.网络宽带

Linux下的各种应用,一般都是基于网络的,因此网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞,而稳定、高速的网络带宽,可以保证应用程序在网络上畅通无阻地运行。幸运的是,现在的网络一般都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响也在逐步降低。

2.2 操作系统相关资源

基于操作系统的性能优化也是多方面的,可以从系统安装、系统内核参数、网络参数、文件系统等几个方面进行衡量,下面依次进行简单介绍。

1.系统安装优化

系统优化可以从安装操作系统开始,当安装Linux系统时,磁盘的划分,SWAP内存的分配都直接影响以后系统的运行性能,例如,磁盘分配可以遵循应用的需求:对于对写操作频繁而对数据安全性要求不高的应用,可以把磁盘做成RAID 0;而对于对数据安全性较高,对读写没有特别要求的应用,可以把磁盘做成RAID 1;对于对读操作要求较高,而对写操作无特殊要求,并要保证数据安全性的应用,可以选择RAID 5;对于对读写要求都很高,并且对数据安全性要求也很高的应用,可以选择RAID10/01。这样通过不同的应用需求设置不同的RAID级别,在磁盘底层对系统进行优化操作。

随着内存价格的降低和内存容量的日益增大,对虚拟内存SWAP的设定,现在已经没有了所谓虚拟内存是物理内存两倍的要求,但是SWAP的设定还是不能忽略,根据经验,如果内存较小(物理内存小于4GB),一般设置SWAP交换分区大小为内存的2倍;如果物理内存大于8GB小于16GB,可以设置SWAP大小等于或略小于物理内存即可;如果内存大小在16GB以上,原则上可以设置SWAP为0,但并不建议这么做,因为设置一定大小的SWAP还是有一定作用的。

2.内核参数优化

系统安装完成后,优化工作并没有结束,接下来还可以对系统内核参数进行优化,不过内核参数的优化要和系统中部署的应用结合起来整体考虑。例如,如果系统部署的是Oracle数据库应用,那么就需要对系统共享内存段(kernel.shmmax、kernel.shmmni、kernel.shmall)、系统信号量(kernel.sem)、文件句柄(fs.file-max)等参数进行优化设置;如果部署的是Web应用,那么就需要根据Web应用特性进行网络参数的优化,例如修改net.ipv4.ip_local_port_range、net.ipv4.tcp_tw_reuse、net.core.somaxconn等网络内核参数。

3.文件系统优化

文件系统的优化也是系统资源优化的一个重点,在Linux下可选的文件系统有ext2、ext3、ReiserFS、ext4、xfs,根据不同的应用,选择不同的文件系统。

Linux标准文件系统是从VFS开始的,然后是ext,接着就是ext2,应该说,ext2是Linux上标准的文件系统,ext3是在ext2基础上增加日志形成的,从VFS到ext4,其设计思想没有太大变化,都是早期UNIX家族基于超级块和inode的设计理念。

XFS文件系统是一个高级日志文件系统,XFS通过分布处理磁盘请求、定位数据、保持Cache 的一致性来提供对文件系统数据的低延迟、高带宽的访问,因此,XFS极具伸缩性,非常健壮,具有优秀的日志记录功能、可扩展性强、快速写入性能等优点。

目前服务器端ext4和xfs是主流文件系统,如何选择合适的文件系统,需要根据文件系统的特点加上业务的需求综合来定。

2.3 、应用程序软件资源

应用程序的优化其实是整个优化工程的核心,如果一个应用程序存在BUG,那么即使所有其他方面都达到了最优状态,整个应用系统还是性能低下,所以,对应用程序的优化是性能优化过程的重中之重,这就对程序架构设计人员和程序开发人员提出了更高的要求。

三、 分析系统性能涉及的人员

3.1、Linux运维人员

在做性能优化过程中,Linux运维人员承担着很重要的任务,首先,Linux运维人员要了解和掌握操作系统的当前运行状态,例如系统负载、内存状态、进程状态、CPU负荷等信息,这些信息是检测和判断系统性能的基础和依据;其次,Linux运维人员还有掌握系统的硬件信息,例如磁盘I/O、CPU型号、内存大小、网卡带宽等参数信息,然后根据这些信息综合评估系统资源的使用情况;第三,作为一名Linux运维人员,还要掌握应用程序对系统资源的使用情况,更深入的一点就是要了解应用程序的运行效率,例如是否有程序BUG、内存溢出等问题,通过对系统资源的监控,就能发现应用程序是否存在异常,如果确实是应用程序存在问题,需要把问题立刻反映给程序开发人员,进而改进或升级程序。

性能优化本身就是一个复杂和繁琐的过程,Linux运维人员只有了解了系统硬件信息、网络信息、操作系统配置信息和应用程序信息才能有针对性地的展开对服务器性能优化,这就要求Linux运维人员有充足的理论知识、丰富的实战经验以及缜密分析问题的头脑。

3.2、系统架构设计人员

系统性能优化涉及的第二类人员就是应用程序的架构设计人员。如果Linux运维人员在经过综合判断后,发现影响性能的是应用程序的执行效率,那么程序架构设计人员就要及时介入,深入了解程序运行状态。首先,系统架构设计人员要跟踪了解程序的执行效率,如果执行效率存在问题,要找出哪里出现了问题;其次,如果真的是架构设计出现了问题,那么就要马上优化或改进系统架构,设计更好的应用系统架构。

3.3、软件开发人员

系统性能优化最后一个环节涉及的是程序开发人员,在Linux运维人员或架构设计人员找到程序或结构瓶颈后,程序开发人员要马上介入进行相应的程序修改。修改程序要以程序的执行效率为基准,改进程序的逻辑,有针对性地进行代码优化。例如,Linux运维人员在系统中发现有条SQL语句耗费大量的系统资源,抓取这条执行的SQL语句,发现此SQL语句的执行效率太差,是开发人员编写的代码执行效率低造成的,这就需要把这个信息反馈给开发人员,开发人员在收到这个问题后,可以有针对性的进行SQL优化,进而实现程序代码的优化。

从上面这个过程可以看出,系统性能优化一般遵循的流程是:首先Linux运维人员查看系统的整体状况,主要从系统硬件、网络设备、操作系统配置、应用程序架构和程序代码五个方面进行综合判断,如果发现是系统硬件、网络设备或者操作系统配置问题,Linux运维人员可以根据情况自主解决;如果发现是程序结构问题,就需要提交给程序架构设计人员;如果发现是程序代码执行问题,就交给开发人员进行代码优化。这样就完成了一个系统性能优化的过程。

四、调优总结

系统性能优化是个涉及面广、繁琐、长久的工作,寻找出现性能问题的根源往往是最难的部分,一旦找到出现问题的原因,性能问题也就迎刃而解。因此,解决问题的思路变得非常重要。

例如,linux系统下的一个网站系统,用户反映,网站访问速度很慢,有时无法访问。

针对这个问题,第一步要做的是检测网络,可以通过ping命令检查网站的域名解析是否正常,同时,ping服务器地址的延时是否过大等等,通过这种方式,首先排除网络可能出现的问题;如果网络没有问题,接着进入第二步,对linux系统的内存使用状况进行检查,因为网站响应速度慢,一般跟内存关联比较大,通过free、vmstat等命令判断内存资源是否紧缺,如果内存资源不存在问题,进入第三步,检查系统CPU的负载状况,可以通过sar、vmstat、top等命令的输出综合判断CPU是否存在过载问题,如果CPU没有问题,继续进入第四步,检查系统的磁盘I/O是否存在瓶颈,可以通过iostat、vmstat等命令检查磁盘的读写性能,如果磁盘读写也没有问题,linux系统自身的性能问题基本排除,最后要做的是检查程序本身是否存在问题。通过这样的思路,层层检测,步步排查,性能问题就“无处藏身”,查找出现性能问题的环节也就变得非常简单。

原文:https://bbs.51cto.com/thread-1584662-1.html

2019-08-09 10:23:09 wuxiaobingandbob 阅读数 735

说明:以下内容是基于Centos7.x  kernel版本为3.10进行测试的结果。

一 CPU 参数调优

1.1性能模式调整

1.1.1作用及影响
调整cpu性能达到最大频率
1.1.2配置调整
可以使用cpupowerutils,默认centos7.x中会安装如果没有安装手动安装
yum install cpupowerutils
cpupower -c all frequency-info #查看cpu所有core的cpufreq信息
cpupower -c all frequency-set -g performance #修改所有core的governor为performance ,默认为powersave模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor #查看cpu性能模式

1.2开启服务器超线程功能

1.1.1作用及影响

注意开启超线程的效果是应用相关的,如果应用都是计算密集型的,那么超线程可能会 降低整体性能。

而对于存储来说,适合打开超线程(现在的服务器默认都会开启超线程功能的)

1.1.2配置调整

# cat /proc/cpuinfo  | grep flags | tail -1 | grep ht  #查看服务器是否开启超线程
flags         : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe ...

dmidecode -t processor | grep HTT #查看服务器是否开启超线程
关闭或者打开超线程
# vi /etc/grub.conf 
OR
# vi /boot/grub/menu.lst
找到以下行,在最后添加noht
kernel /boot/vmlinuz-2.6.8-2-686 root=/dev/hdb1 ro single noht

1.3Numa参数调整

1.3.1作用及影响

Numa是不均匀内存分配, Numa在开启状态下,会出现以下弊端:

当你的服务器还有内存的时候,发现它已经在开始使用 swap 了,甚至已经导致机器出现 停滞的现象,出现性能问题,所以在umstor的配置要求中需要关闭numa。

  在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%;

  在bios层面numa关闭时,无论os层面的numa是否打开,都不会影响性能。

1.3.2配置调整
# grep -i numa /var/log/dmesg #检查 numa 是否可用(检测bios层面是否开启numa)

# numactl --hardware #查看 CPU 和 NUMA 配置,需要安装numactl工具(available: 1 nodes (0)       #如果是2或多个nodes就说明numa没关掉)

# hwloc-ls #更详细的查看 CPU 拓扑和各级缓存以及共享的资源(包括磁盘)

 

1)在centos7.x中关闭numa编辑 /etc/default/grub 文件,如下图所示加上:numa=off


2)重新生成 /etc/grub2.cfg 配置文件:
grub2-mkconfig -o /etc/grub2.cfg

3)重启服务器后,cat /proc/cmdline查os层面禁用numa是否成功

 

命令行关闭numa.service服务
# systemctl disable numa.service
#numactl --interleave=all #关闭numa的限制(临时修改)

使用numa

如果要使用numa就需要将固定的osd绑定到对应的numa node上

 

设置绑定方法如下:

方式一:

# numactl --cpunodebind=1 --membind=1 /home/yhg/work/pufa/build/bin/ceph-osd -i 0 -c /home/yhg/work/pufa/build/ceph.conf

查看是否生效:

# for i in $(pgrep ceph-osd) ; do taskset -pc $i ; done
pid 8855's current affinity list: 6-11,18-23

方式二

修改 /usr/lib/systemd/system/ceph-osd@.service 文件,在 [Service] 部分增加如下内容:

CPUAffinity= 6 7 8 9 10 11 18 19 20 21 22 23
systemctl daemon-reload
systemctl restart ceph-osd@osd.$i

总结:为避免numa对umstor集群的影响,要关闭numa功能,可以从BIOS,操作系统,启动进程时临时关闭这个特性,最彻底的关闭就是从bios中进行关闭。

二 内存参数调优

2.1THP(Transparent HugePages)

2.1.1作用及影响
对于有些场景 THP 会带来 10% 的性能提升,也带来了两个潜在的风险:
1)内存泄漏
2)大量的 merge/split 内存区域操作消耗大量 CPU,有些应用会有 30% 的性能损失。
Centos7 上默认开启 THP:
2.1.2配置调整
#cat /sys/kernel/mm/transparent_hugepage/defrag #查看THP的状态
# cat /sys/kernel/mm/transparent_hugepage/enabled #查看THP的状态
[always] madvise never #可以看到有三个选项,always是默认选项,nerver是关闭选项。
为了克服上面说到的弊端,可以使用 madvise 选项。该选项让支持 madvise 的程序 继续享受 THP 的好处,又让不支持 madvise 的程序不受影响。
修改成 madvise

修改THP状态的方式:
方式一:我们这个时候当然可以逐个修改上述两文件(defrag和enabled),来禁用THP
方式二:永久性修改

编辑rc.local文件:
[root@localhost ~]# vim /etc/rc.d/rc.local
增加下列内容:
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

保存退出,然后赋予rc.local文件执行权限:
[root@localhost ~]# chmod +x /etc/rc.d/rc.local

 

最后重启系统,以后再检查THP应该就是被禁用了
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

2.2 ksm调整

2.2.1作用及影响
ksm对ceph的作用时反面的,对windows的kvm客户机环境有用,对于rhel的环境应该被disabled
2.2.1配置调整
# systemctl status ksm.service ksmtuned.service
# systemctl stop ksm.service ksmtuned.service
# systemctl disable ksm.service ksmtuned.service

2.3swappiness调整

2.3.1作用及影响
参数值可为 0-100,控制系统 swap 的程序。高数值可优先系统性能,在进程不活跃时 主动将其转换出物理内存。低数值可优先互动性并尽量避免将进程转换处物理内存, 并降低反应延迟。默认值为 60。
swappiness=0 的时候表示最大限度使用物理内存,然后才是 swap空间。
影响:物理内存还比较充足,vm.swappiness已经设置为0,但系统还是用了swap分区
原因:根因是虚拟机machine.slice和系统system.slices、user.slices等使用了swap空间,
通过sysctl -w设置vm.swappiness并不能改变cgroup中machine.slice、system.slices、user.slices等里面对应的memory.swappiness值,这些值继承/sys/fs/cgroup/memory下vm.swappiness的值,当创建子目录后,再创建子目录,此时vm.swappiness的值继承于父目录里对应的vm.swappiness值,因此,在系统运行时,只改变/sys/fs/cgroup/memory这个根目录的值,并不影响已创建子目录的vm.swappiness配置,所以如果需要更改,就要手动操作.

2.3.2配置调整
# sysctl -a |grep swappiness #查看当前值

临时修改
sysctl -w vm.swappiness=0
手动更改/sys/fs/cgroup/memory下子目录对应的memory.swappiness值

永久修改(重启生效,保证值都是新的)
# sysctl -w vm.swappiness=0 #修改swappiness值
echo vm.swappiness = 0 >> /etc/sysctl.conf #永久修改


2.4min_free_kbytes调整

2.4.1作用及影响
将min_free_kbytes设置得太低会阻止系统回收内存。这可能导致系统挂起并杀死多个进程。
但是,将此参数设置为过高的值(占系统总内存的5-10%)将导致系统立即内存不足。
默认为 90112KB。
建议值:
// For 64GB RAM, reserve 1GB.
vm.min_free_kbytes = 1048576

// For 128GB RAM, reserve 2GB.
vm.min_free_kbytes = 2097152

// For 256GB RAM, reserve 3GB.
vm.min_free_kbytes = 3145728
2.4.2配置及调整
# sysctl -a |grep min_free_kbytes #查看当前值
# sysctl -w vm.min_free_kbytes=1048576 #修改min_free_kbytes值
echo vm.min_free_kbytes = 1048576 >> /etc/sysctl.conf #永久修改

2.5 dirtry_ratio

2.5.1作用及影响

# sysctl -a | grep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500


dirty_background_ratio: 是内存可以填充“脏数据”的百分比。这些“脏数据”在稍后是会写入磁盘的,pdflush/flush/kdmflush这些后台进程会稍后清理脏数据。举一个例子,我有32G内存,那么有3.2G的内存可以待着内存里,超过3.2G的话就会有后来进程来清理它。
dirty_ratio: 是绝对的脏数据限制,内存里的脏数据百分比不能超过这个值。如果脏数据超过这个数量,新的IO请求将会被阻挡,直到脏数据被写进磁盘。这是造成IO卡顿的重要原因,但这也是保证内存中不会存在过量脏数据的保护机制。
dirty_expire_centisecs: 指定脏数据能存活的时间。在这里它的值是30秒。当 pdflush/flush/kdmflush 进行起来时,它会检查是否有数据超过这个时限,如果有则会把它异步地写到磁盘中。
dirty_writeback_centisecs: 指定多长时间 pdflush/flush/kdmflush 这些进程会起来一次。
举例:
vm.dirty_background_ratio = 5
vm.dirty_ratio = 80
表示 "后台进行在脏数据达到5%时就开始异步清理,但在80%之前系统不会强制同步写磁盘。这样可以使IO变得更加平滑"

2.5.2配置调整

# sysctl -a |grep dirty_background_bytes #查看当前值
# sysctl -w vm.dirty_background_bytes = 0 #修改min_free_kbytes值
echo vm.dirty_background_bytes = 0 >> /etc/sysctl.conf #永久修改

 

2.6 max_map_count

2.6.1作用及影响

vm.max_map_count默认为 65530

2.6.2配置调整

# sysctl -a |grep vm.max_map_count #查看当前值
# sysctl -w vm.max_map_count = 65530 #修改min_free_kbytes值
echo vm.max_map_count = 65530>> /etc/sysctl.conf #永久修改

 

三 网络优化

3.1 jumbo frames巨型帧

3.1.1 作用及影响

根据IEEE 802.3,现在IEEE规定的Ethernet MTU是1500个字节。1500个字节在payload上用完,1500/1542 (1500+26+4+12=1544)= 97.28%是这个限制下最高的利用效率(假设使用802.1Q VLAN tagging )。随着网络的日渐发达,对性能的要求愈加苛刻,人们不满足于1500MTU,所以拥有9000字节payload的Jumbo Frame便应运而生。

使用上,比较重要的一点是,Jumbo Frame在一套系统中的应用,必须是end-to-end的。在网络传输中的每个帧传传输节点中,任何一个节点没能支持同一MTU的Jumbo Frame,那么那一个部分就可能成为整个系统的网络瓶颈——木桶原理,最慢的一环决定了整体的速度。

1)所以首先需要服务器的接入交换机支持jumbo frames(目前,主流交换机厂商的的设备基本都支持)

2)服务器网卡的jumbo frames配置

 3.1.2配置调整

临时设置:

# ifconfig eth0 mtu 9000

永久配置:

编辑网卡配置文件:vi /etc/sysconfig/network-script/ifcfg-xxx 中添加MTU 9000

重启网络服务:systemctl restart network

查看MTU配置是否生效:ip a |grep mtu

 

3.2 调整网卡的 Rx/Tx传输接收队列大小

 

查看当前的队列大小:

# ethtool -g enp131s0f1
Ring parameters for enp131s0f1:
Pre-set maximums:
RX:           4096
RX Mini:      0
RX Jumbo:     0
TX:           4096
Current hardware settings:
RX:           512
RX Mini:      0
RX Jumbo:     0
TX:           512

上面表明,硬件支持最多 4096 个 Rx/Tx 等待队列。当前使用了 512 个。

可以增加到 4096 个:

# ethtool -G enp131s0f1 rx 4096 tx 4096
# ethtool -g enp131s0f1
Ring parameters for enp131s0f1:
Pre-set maximums:
RX:           4096
RX Mini:      0
RX Jumbo:     0
TX:           4096
Current hardware settings:
RX:           4096
RX Mini:      0
RX Jumbo:     0
TX:           4096

调整完成后,大部分网卡驱动会将网卡先 down 掉再启动,该接口上的已有连接也会断掉。

四 磁盘优化及配置

4.1磁盘cache优化及raid配置

http://idocs.umcloud.com:8090/pages/viewpage.action?pageId=8852959

4.2 块设备调度调整

4.2.1 queue参数

默认的 io 调度队列大小:

# cat /sys/block/sda/queue/nr_requests
128
# cat /sys/block/nvme0n1/queue/nr_requests
1023

调整为大点的值,能增加机械盘执行顺序io的比例,提升整体吞吐。 

修改io调度队列大小

echo 1023 /sys/block/sda/queue/nr_requests

4.2.2 io调度器调整

对于 nvme 有:

# cat /sys/block/nvme0n1/queue/scheduler
[none] mq-deadline kyber

对于 hdd:

# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

sata ssd:

# cat /sys/block/sdi/queue/scheduler
noop [deadline] cfq

对于 nvme ssd 来说 mq-deadline 可能是个比较好的选项。

 

修改调度器:

echo deadline >/sys/block/sda/queue/scheduler

 

4.3 nvme ssd优化lbaf配置

1. 检查 lbaf 为最优模式

[root@um14 /]# nvme list-ns /dev/nvme0
[   0]:0x1
[root@um14 /]# nvme id-ns /dev/nvme0 --namespace-id=0x1
NVME Identify Namespace 1:
nsze    : 0x2e934856
ncap    : 0x2e934856
nuse    : 0x2e934856
nsfeat  : 0
nlbaf   : 3
flbas   : 0x2
mc      : 0x1
dpc     : 0x17
dps     : 0
nmic    : 0
rescap  : 0
fpi     : 0
nawun   : 0
nawupf  : 0
nacwu   : 0
nabsn   : 0
nabo    : 0
nabspf  : 0
noiob   : 0
nvmcap  : 0
nguid   : 00000000000000000000000000000000
eui64   : 000cca00611bcc01
lbaf  0 : ms:0   lbads:9  rp:0
lbaf  1 : ms:8   lbads:9  rp:0x2
lbaf  2 : ms:0   lbads:12 rp:0 (in use)
lbaf  3 : ms:8   lbads:12 rp:0x1

2. 修改 lbaf 示例

 

[root@um14 /]# nvme format -n 0x1 -l 1 -m 1 -i 1 -s 1 /dev/nvme0n1
Success formatting namespace:1
[root@um14 /]# nvme id-ns /dev/nvme0 --namespace-id=0x1
NVME Identify Namespace 1:
nsze    : 0x1749a42b0
ncap    : 0x1749a42b0
nuse    : 0x1749a42b0
nsfeat  : 0
nlbaf   : 3
flbas   : 0x11
mc      : 0x1
dpc     : 0x17
dps     : 0x1
nmic    : 0
rescap  : 0
fpi     : 0
nawun   : 0
nawupf  : 0
nacwu   : 0
nabsn   : 0
nabo    : 0
nabspf  : 0
noiob   : 0
nvmcap  : 0
nguid   : 00000000000000000000000000000000
eui64   : 000cca00611bcc01
lbaf  0 : ms:0   lbads:9  rp:0
lbaf  1 : ms:8   lbads:9  rp:0x2 (in use)
lbaf  2 : ms:0   lbads:12 rp:0
lbaf  3 : ms:8   lbads:12 rp:0x1

 

 

五 其他系统资源调整

用sysctl -a 查看以下参数

最大进程描述符个数

// 默认为 32768
# sysctl -w kernel.pid_max=4194303
永久调整需要写到配置文件中echo kernel.pid_max=4194303>>/etc/sysctl.conf

最大线程个数

# sysctl -w kernel.threads-max=2097152
永久调整需要写到配置文件中echo kernel.threads-max=2097152 >>/etc/sysctl.conf

 

系统异步 I/O 上下文中可允许的最多事件数

// 默认为 65535
# sysctl -w fs.aio-max-nr=1048576
永久调整需要写到配置文件中echo fs.aio-max-nr=1048576 >>/etc/sysctl.conf

查看当前系统的 aio 请求个数

# cat /proc/sys/fs/aio-nr
2016-11-02 14:09:09 luokehua789789 阅读数 5002

原文:http://blog.csdn.net/hn2002/article/details/7426907


Linux 性能分析以及调优介绍

    写在前面:计算机要解决的基本问题之一是如何在不增添更多硬件能力的情况下使其能够完成更多工作;而我们应用设计的一项重要伸缩性原则是:随着应用的推广和访问流量的增加,通过相应数量的服务器资源来应对;资源的消耗应该随负载线性(或更佳)上升,负载可由用户流量、数据量等测量;可以参考ebay的架构最佳实践:
    http://www.infoq.com/cn/articles/ebay-scalability-best-practices
    
本节介绍linux性能分析工具;下一节介绍各个层面的可调参数;最后一节介绍一个web性能问题分析案例;

  第一节  性能监控 
 1)整体系统cpu利用率 
    系统性能的指标之一就是系统对用户的响应速度。在对系统的方法化分析中,首要且最近本的工具之一常常是对系统的cpu利用率进行简单测量。
    $ uptime 
    10:17:40 up 6 days, 59 min,  6 users,  load average: 0.00, 0.00, 0.00
    主要看load average也就是我们通常说的服务器load(平均负荷值),代表1分钟,5分钟,15分钟
    系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中:
  - 它没有在等待I/O操作的结果
  - 它没有主动进入等待状态(也就是没有调用'wait')
  - 没有被停止(例如:等待终止)
    (但也有例外,看各个系统的计算方式了,我的debian发布版,从man uptime里System load averages is the average number of processes that are either in a runnable or uninterruptable state,可见它包括等待i/o的线程)
   vmstat命令实时监控系统各个方面的数据;例如每隔3秒显示一下系统性能数据:
   $vmstat 3 
    procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
     1  0 192824  93020 317960 770156    0    1    73    79  114  108 20 23 56  2
     0  0 192824  93012 317960 770164    0    0     0     0  958 2223  7 10 84  0
     procs部分提供了生成报告时正在运行的进程数据(r)以及被阻塞的进程数目(b);
     memory部分提供了换出内存(swpd),空闲内存(free),i/o数据结构的缓冲区缓存(buff),以及从磁盘读取文件的内存缓存(cache)的容量,单位为KB;
     swap部分提供了从磁盘上换入的内存容量(si)以及换出到磁盘上的内存量(so),单位kB/s;
     io部分提供了从设备读入的块数(bi)以及写出到设备上的块数(bo).单位为KB/s;
     system部分提供了每秒的中断数目(in)和上下文切换数目(cs);
     cpu部分提供了用户(us),系统(sy),真正空闲(id),已经等待I/O完成(wa)在cpu总时间中所占百分比。cpu利用率也许是最常用的量度。若wa过大,则应该检查I/O子系统,
        例如,可以判定需要更多的I/O控制器和磁盘以减少I/O等待的时间;
    
    top和gtop命令:提供所有正在运行的进程和系统载荷提供不断更新的概览信息,包括CPU负荷,内存使用以及每隔进程的内存使用情况;
    sar是sysstat工具包的组成部分;它收集并报告错哦阿左系统中广泛的系统活动,包括CPU利用率,上下文切换和中断速率,页换入,和页换出速率,共享内存使用情况,
    设备性能情况,缓冲区使用情况以及网络使用情况;

 2)内存利用率

   工作负荷有可能会耗尽所有可用的内存。Linux提供了对物理内存进行合理,高效的访问并可以访问潜在的海量虚存的技术。虚存通常稍多于操作系统实际拥有的内存容量,以便将较少使用的数据卸载到磁盘存储器上,同时又呈现出系统拥有大量物理内存的假象。糟糕的是,卸载内存的开销可能会比应用延迟高出数十甚至上百倍。如果被换出到磁盘上的内存空间是错误的内存页,或者如果应用程序的当前内存印迹大于物理内存容量的话,那么这些过高的延迟会极大的影响应用的响应时间;

 通过/proc/meminfo和/proc/slabinfo可以监视系统内存资源的整体利用情况;

 可以通过ps aux 查看每个进程消耗系统内存的总体百分比,以及该进程的虚存印迹(VSZ)和当前使用的物理内存量(RSS)。也可以使用top交互式的查看进行列表。然后通过/proc/pid(进行id)/maps查看进行地址空间的所有映射及其大小,等内存分布状况信息。

通过vmstat可以监视内存可用性和交换活动。vmstat可以协助发现异常的系统活动,例如会导致操作系统性能下降的过多的页面错误或上下文切换操作。结合cpu利用率的us,sy,id,wa监视,如果wa的值过大,则要查看I/O系统,结论有可能是需要更多I/O控制器和磁盘以便减少I/O等待时间;

 $vmstat
 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
   r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
   4  0 306792 159560 228680 298932    0    1    75    84   65   71 19 21 58  2

 


 3)磁盘I/O的利用率和延迟 
    尽管整体的处理器速度,内存大小以及I/O执行速度在不断提高,但I/O操作的吞吐率和延迟性能仍然要比等价的内存访问操作低多个数量级;另外,由于许多工作负荷都
    拥有重要的I/O组件,I/O处理容易成为整体吞吐律和应用整体响应时间的重要瓶颈;以下介绍iostat命令:
    $iostat
    Linux 2.6.32-5-686 (zhaopeng)     07/07/2010     _i686_    (2 CPU)

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              18.93    0.50   22.80    1.57    0.00   56.21

    Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    sda               5.63        90.79        99.44   47760868   52308144
    
    iostat报告的CPU利用心里类似于top工具提供的内容;之后给出各个磁盘的利用情况的报告;
    tps列表示发至逻辑磁盘的I/O请求数;Blk_read/s 和Blk_wrtn/s 给出分别对应于读写该逻辑驱动器的数据量,以每秒的块数为单位;
    iostat 默认显示以块为单位,也可以加参数iostat -k 以KB为单位显示;

 4)网络I/O利用率 
    netstat 是监视linux服务器上网络链接的最常用工具之一;该工具可以显示每种网络协议例如TCP和UDP的活跃socket列表,还提供了关于网络路由信息以及网络接口的累积统计数据,包括输入输出报文数量以及报文冲突次数;
    常用的工具:netstat; iftop;ifstat;apache自带的ab测试工具;

 

参考:《linux服务器性能调整》

          《深入理解linux内核》

 

 

上次简单介绍了下,linux的cpu,memory,disk i/o; net i/o 性能监控的一些工具;这节就介绍下,这些层面上出现瓶颈时,怎样调节内核,有那些内核参数可以调节来获得性能的提升; 下节介绍下:怎么识别性能瓶颈,当然只是空想了,怎样识别需要具体问题具体对待了;
      希望对这些参数的介绍使大家对于linux的内核有一定的认识;

 

第一节:cpu 性能瓶颈 
      计算机中,cpu是最重要的一个子系统,负责所有计算任务;基于摩尔定律的发展,cpu是发展最快的一个硬件,所以瓶颈很少出现在cpu上;我们线上环境的cpu都是多核的,并且基于SMP(symmetric multiprocessing)结构的。通过观察线上机器cpu使用率会发现,使用率很低很低,不到5%; 说明我们的资源浪费情况多么严重啊;(但为什么不能一台机器多部署几个应用呢,后边我会解释); 我们线上的cpu一个核支持超级线程,也就是一个核上可以并行运行几个线程)
1. 通过调整进程优先级调整: nice 命令来调整进程优先级别;可调范围(-20到 19) 如: renice 5 pid
2.通过调整cpu的亲和度来集中处理某一个中断类型:将系统发出的中断都绑定在一个cpu上,这样其他cpu继续执行自己正在执行的线程,不被中断打扰,从而较少了线程上下文切换时间,增强性能;
注: cpu亲和度的概念: 在多核cpu中,linux操作系统抢占式调度系统,按照cpu时间片/中断/等 不断调度进程给cpu去执行的;如果在一个时间片调度线程1在cpu1上运行,另外一个时间片调度线程1在cpu2上去运行,这样会造成线程执行速度慢,性能降低。为什么呢? 我们知道SMP上多核都是共享L1 ,L2 CPU Cache的。并且各个核的内存空间都是不可共享的,一个线程如果多次时间片上在不同的cpu上运行,会造成cache的不断失效和写入;性能会降低; 而linux的进程调度有个亲和度算法可以将尽量将进程每次都调度到同一个cpu上处理;linux调度时当然也有Loadbalance算法保证进程调度的均匀负载的;
例如: echo 03 > /proc/irq/19/smp-affinity (将中断类型为19的中断绑定到第三个cpu上处理)


                                                第二节:内存性能瓶颈 
      首先,linux的内存管理是聪明和智能的;linux通过(virtual memory manage)来管理内存的; 对于大多数应用,linux是不直接写到硬盘上去的,而是先写到 virtual memory manage 管理的文件系统缓存(也在内存中的)里 .方便应用的后续的读请求;因为和磁盘的I/O操作是昂贵的;linux会根据一些算法策略适当的时候同步到硬盘的;这就是为什么我们运行linux一段时间后,发现可用内存那么少的原因,多数被cache+buffer占用咧;
所以我们提高性能的办法就是减少写到磁盘的次数,提高每次写磁盘时的效率质量;
1. 通过调节缓存的脏数据同步到硬盘的策略:(脏数据表示没有被当前的线程使用的数据)
例如: echo 10 > /proc/sys/vm/dirty_background_rato (当脏数据占据物理内存10%时,触发pdflush同步到硬盘):小心调节,会大幅度的影响性能;
echo 2000 > /proc/sys/vm/dirty_expire_centisecs (当脏数据在物理内存的逗留时间超过2000ms时被同步到硬盘);
2.通过调节swap参数,来优化linux虚拟内存管理:基于程序的局部性原理,linux通过虚拟内存机制来实现并发运行进程,linux发现物理内存不够用时,会根据LRU算法将一部分内存swap out到硬盘;当运行被换出的那个线程时,在swap in 到内存里;
例如: echo 10 > /proc/sys/vm/swappiness(值为0表示尽量都用物理内存,值为100表示积极的使用swap分区;)这个参数很重要;小心调节; 一般为60; 

                                                   第三节: 磁盘I/O可调性能参数 
           linux的子系统VFS(virtural file system)虚拟文件系统;从高层将各种文件系统,以及底层磁盘特性隐藏,对程序员提供:read,write,delete等文件操作;这就是之所以我们可以在linux上mount多种不同格式的文件系统的,而window确不行; 当然基于:虚拟文件系统,文件系统,文件系统驱动程序,硬件特性方面,都能找到性能瓶颈;
1.选择适合应用的文件系统;
2. 调整进程I/O请求的优先级,分三种级别:1代表 real time ; 2代表best-effort; 3代表idle ;
如:ionice -c1 -p1113(给进程1113的I/O优先级设置为最高优先级)
3.根据应用类型,适当调整page size 和block size;
4.升级驱动程序; 

                                                               第四节 :网络可调性能参数 
对于我们web应用来说,网络性能调整如此重要,linux的网络支持是无与伦比的;是作为网络服务器的首先;对于web服务来说:除了应用的响应速度外,linux网络管理子系统,网卡,带宽都可能成为性能瓶颈;
1.查看网卡设置是否全双工传输的: echtool eth0
2. 设置MTU(最大传输单元),在带宽G以上的时候,要考虑将MTU增大,提高传输性能;如: ifconfig eth0 mtu 9000 up
3. 增加网络数据缓存;传输数据时linux是将包先放入缓存,填满缓存后即发送出去;读操作类似;
sysctl -w net.ipv4.tcp_rmem="4096 87380 8388608" :设置tcp读缓存:最小缓存,初始化时,最大缓存
sysctl -w net.ipv4.tcp_wmem="4096 87380 8388608" :设置tcp写缓存:最小缓存,初始化时,最大缓存
4.禁用window_scaling,并且直接设置window_size;(就像我们经常设置jvm的参数:xms = xmx一样
sysctl -w net.ipv4.tcp_window_scaling=0
5.设置TCP连接可重用性: 对于TIME_OUT状态的TCP连接可用于下一个TCP重用,这样减少了三次握手和创建时间,非常提高性能,尤其对于web server;
如: 开启可重用tcp功能: sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_tw_recyle=1 
6.禁用掉没必要的tcp/ip协议功能:比如icmp;broadcast包的接收;
7. linux对于keeplive的tcp连接有一个默认的过期时间;可以减小这个时间,让没用的连接释放掉,毕竟tcp连接数是有限的嘛;
如: sysctl -w net.ipv4.tcp_keepalive_time=1800 (设置过期时间,1800s)
8.设置最大tcp正在连接状态(还没ESTABLISHED)队列长度;避免由于太多的tcp连接过来,导致服务器挂掉;比如DoS攻击
如:sysctl -w net.ipv4.tcp_max_syn_backlog=4096
9. 绑定tcp类型的中断到一个cpu上;(让cpu去亲和这个类型中断,避免频繁的中断,影响线程调度性能) 


          总结: 我们在性能优化一个应用时,首要的是设定优化要达到的目标,然后寻找瓶颈,调整参数,达到优化目的;但是寻找瓶颈时可能是最累的,要从大范围,通过很多用例,很多测试报告,不断的缩小范围,最终确定瓶颈点;以上这些参数只是个认识,系统性能优化中可能用到,但并不是放之四海而皆准的; 有的参数要边测试,边调整的; 

浅谈系统调优

阅读数 1241