Linux - Linux内存管理

简介: Linux - Linux内存管理


image.png

影响Linux性能的因素

CPU


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


目前大部分CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因此,可以利用处理器的超线程特性提高系统性能。在Linux系统下,只有运行SMP内核才能支持超线程,但是,安装的CPU数量越多,从超线程获得的性能方面的提高就越少。


另外,Linux内核会把多核处理器当作多个单独的CPU来识别,例如两个4核的CPU,在Lnux系统下会被当作8个单核CPU。但是从性能角度来讲,两个4核的CPU和8个单核的CPU并不完全等价,根据权威部门得出的测试结论,前者的整体性能要比后者低25%~30%。


内存


内存的大小也是影响Linux性能的一个重要的因素。内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,导致资源浪费。


Linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降。


要保证应用程序的高性能运行,物理内存一定要足够大;但是过大的物理内存,会造成内存资源浪费.


磁盘I/O性能


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


RAID(Redundant Array of Independent Disk,独立磁盘冗余阵列,简称磁盘阵列)通过将多块独立的磁盘(物理硬盘)按不同方式组合起来形成一个磁盘组(逻辑硬盘),从而提供比单个硬盘更高的I/O性能和数据冗余。


通过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级别,从而保证应用程序在磁盘方面达到最优性能。


网络宽带


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


操作系统相关资源

系统安装优化


系统优化可以从安装操作系统开始。当安装Linux系统时,磁盘的划分、交换分区内存的分配都直接影响以后系统的运行性能.


例如,磁盘分配可以遵循应用的需求:


对于写操作频繁而对数据安全性要求不高的应用,可以把磁盘做成RAID0;

而对于对数据安全性较高而对读写没有特别要求的应用,可以把磁盘做成RAID1;

对于对读操作要求较高而对写操作无特殊要求并要保证数据安全性的应用,可以选择RAID5;

对于对读写要求都很高并且对数据安全性要求也很高的应用,可以选择RAID0+1。

这样通过不同的应用需求设置不同的RAID级别,在磁盘底层对系统进行优化操作。


随着内存价格的降低和内存容量的日益增大,对虚拟内存交换分区的设定,现在已经没有了所谓虚拟内存是物理内存两倍的要求,但是交换分区的设定还是不能忽略。


根据经验,


如果内存较小(物理内存小于4GB),一般设置交换分区交换分区大小为内存的2倍;

如果物理内存大于8GB小于16GB,可以设置交换分区大小等于或略小于物理内存即可;

-如果内存大小在16GB以上,原则上可以设置交换分区为0,但并不建议这么做,因为设置一定大小的交换分区还是有一定作用的。


内核参数优化


系统安装完成后,优化工作并没有结束。接下来。还可以对系统内核参数进行优化。不过,内核参数的优化要和系统中部署的应用结合起来整体考虑。


如果部署的是Web应用,那么就需要根据Web应用特性进行网络参数的优化,例如,修改net.ipv4.ip_local_ port_range、net.ipv4.tcp_tw_reuse、net.core.somaxconn等网络内核参数


文件系统优化


在Linux下可选的文件系统有ext2、ext3、ReiserFS、ext4、XFS。根据不同的应用,选择不同的文件系统。


应用程序软件资源


应用程序的优化其实是整个优化工程的核心。如果一个应用程序存在bug,那么即使所有其他方面都达到了最优状态,整个应用系统还是性能低下。所以,对应用程序的优化是性能优化过程的重中之重。


系统性能分析工具


如何从系统上发现是某个方面或某几个方面出现问题了呢?这就需要使用Linux系统提供的几个常用性能分析工具。


vmstat命令


vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,很多Linux发行版本都默认安装了此命令工具。


利用vmstat命令可以对操作系统的内存信息、进程状态、CPU活动等进行监控,不足之处是无法对某个进程进行深入分析。

vmstat使用语法如下。


[root@VM-24-3-centos ~]# vmstat --help
Usage:
 vmstat [options] [delay [count]]
Options:
 -a, --active           active/inactive memory
 -f, --forks            number of forks since boot
 -m, --slabs            slabinfo
 -n, --one-header       do not redisplay header
 -s, --stats            event counter statistics
 -d, --disk             disk statistics
 -D, --disk-sum         summarize disk statistics
 -p, --partition <dev>  partition specific statistics
 -S, --unit <char>      define display unit
 -w, --wide             wide output
 -t, --timestamp        show timestamp
 -h, --help     display this help and exit
 -V, --version  output version information and exit
For more details see vmstat(8).
[root@VM-24-3-centos ~]#


  • -V:表示输出版本信息,是可选参数。
  • -n:表示在周期性循环输出时,输出的头部信息仅显示一次。
  • delay:表示两次输出之间的间隔时间。
  • count:表示按照“delay”指定的时间间隔统计的次数。默认为1。


例如:

vmstat 3


表示每3秒钟更新一次输出信息,循环输出,按Ctrl+c组合键停止输出。

vmstat 3 5



表示每3秒更新一次输出信息,统计5次后停止输出。


iostat命令

iostat是I/O statistics(输入/输出统计)的缩写,主要的功能是对系统的磁盘I/O操作进行监控。它的输出主要显示磁盘读写操作的统计信息,同时也会给出CPU使用情况。

同vmstat一样,iostat也不能对某个进程进行深入分析,仅对系统的整体情况进行分析


iostat一般都不随系统安装。要使用iostat工具,需要在系统上安装一个Sysstat工具包。Sysstat是一个开源软件,官方地址为http://pagesperso-orange.fr/sebastien.godard


可以选择以源代码包或rpm包的方式安装。安装完毕,系统会多出3个命令:iostat、sar和mpstat。然后就可以直接在系统下运行iostat命令了。


iostat使用语法如下。

iostat [ -c | -d ] [ -k ] [ -t ] [ -x [ device ] ] [ interval [ count ] ]
[root@VM-24-3-centos ~]# iostat --help
Usage: iostat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ -j { ID | LABEL | PATH | UUID | ... } ]
[ [ -T ] -g <group_name> ] [ -p [ <device> [,...] | ALL ] ]
[ <device> [...] | ALL ]
[root@VM-24-3-centos ~]#

各个选项及参数含义如下。


-c:显示CPU的使用情况。


-d:显示磁盘的使用情况。


-k:每秒以千字节为单位显示数据。


-t:输出统计信息开始执行的时间。


-x device:指定要统计的磁盘设备名称,默认为所有的磁盘设备。


interval:指定两次统计间隔的时间。


count:按照“interval”指定的时间间隔统计的次数。


sar命令


sar命令很强大,是分析系统性能的重要工具之一。通过sar指令,可以全面地获取系统的CPU、运行队列、磁盘I/O、分页(交换区)、内存、CPU中断、网络等性能数据。


sar使用格式如下。

sar [options] [-o filename] [interval [count] ]
[root@VM-24-3-centos ~]# sar -help
Usage: sar [ options ] [ <interval> [ <count> ] ]
Options are:
[ -A ] [ -B ] [ -b ] [ -C ] [ -d ] [ -F [ MOUNT ] ] [ -H ] [ -h ] [ -p ] [ -q ] [ -R ]
[ -r ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -V ] [ -v ] [ -W ] [ -w ] [ -y ]
[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]
[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]
[ -j { ID | LABEL | PATH | UUID | ... } ]
[ -f [ <filename> ] | -o [ <filename> ] | -[0-9]+ ]
[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]
[root@VM-24-3-centos ~]#


各个选项及参数含义如下。


options 为命令行选项,sar命令的选项很多,下面只列出常用选项:

-A:显示系统所有资源设备(CPU、内存、磁盘)的运行状况。

-u:显示系统所有CPU在采样时间内的负载状态。

-P:显示当前系统中指定CPU的使用情况。

-d:显示系统所有硬盘设备在采样时间内的使用状况。

-r:显示系统内存在采样时间内的使用状况。

-b:显示缓冲区在采样时间内的使用情况。

-v:显示进程、文件、inode节点和锁表状态。

-n:显示网络运行状态。参数后面可跟DEV、EDEV、SOCK和FULL。DEV显示网络接口信息,EDEV显示网络错误的统计数据,SOCK显示套接字信息,FULL显示以上三个信息。它们可以单独或者一起使用。

-q:显示运行队列的大小,它与系统当时的平均负载相同。

-R:显示进程在采样时间内的活动情况。

-y:显示终端设备在采样时间内的活动情况。

-w:显示系统交换活动在采样时间内的状态。

-o filename:表示将命令结果以二进制格式存放在文件中,filename是文件名。

interval:表示采样间隔时间,是必须有的参数。

count:表示采样次数,是可选参数,默认值是1。


示例如下

要查看系统CPU的整体负载状况,每3秒统计一次,统计5次,可以使用以下命令。

sar –u 3 5

系统的CPU计数是从0开始的,如果要查看第二颗CPU的运行负载,使用以下命令。

sar –P 1 3 5

要查看系统磁盘的读写性能,使用以下命令。

sar -d 3 5

同理,要查看系统内存使用情况、网络运行状态,可以分别使用以下命令。

sar -r 5 2
sar -n DEV 5 3


系统性能分析标准


性能调优的主要目的是使系统能够有效地利用各种资源,最大地发挥应用程序和系统之间的性能融合,使应用高效、稳定地运行。


但是,衡量系统资源利用率好坏的标准没有一个严格的定义,针对不同的系统和应用也没有一个统一的说法。因此,这里提供的标准其实是一个经验值。

【判定系统资源利用状况的一般准则】

image.png


其中


%user表示CPU处在用户模式下的时间百分比;

%sys表示CPU处在系统模式下的时间百分比;

%iowait表示CPU等待输入输出完成时间的百分比;

swap in即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM;

swap out即so,表示虚拟内存的页导出,即从RAM交换到SWAP DISK。


小结


我们只说了三个常用的系统性能分析工具。其实Linux下的性能分析工具还有很多。例如,uptime可以检查CPU的平均负载,free可以查看系统内存的使用状况,ps、top可以配合监控系统的进程运行状态,netstat可以监测网络流量状况,等等


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


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


针对这个问题,


第一步要做的是检测网络,可以通过ping命令检查网站的域名解析是否正常。同时,ping服务器地址的延时是否过大,等等。通过这种方式,首先排除网络可能出现的问题。如果网络没有问题

接着进入第二步,对Linux系统的内存使用状况进行检查。因为网站响应速度慢,一般跟内存关联比较大,通过free、vmstat等命令判断内存资源是否紧缺。如果内存资源不存在问题,

进入第三步,检查系统CPU的负载状况,可以通过sar、vmstat、top等命令的输出综合判断CPU是否存在过载问题。如果CPU没有问题,

继续进入第四步,检查系统的磁盘I/O是否存在瓶颈,可以通过iostat、vmstat等命令检查磁盘的读写性能。如果磁盘读写也没有问题,Linux系统自身的性能问题基本排除。

最后要做的是检查程序本身是否存在问题。通过这样的思路,层层检测,步步排查,性能问题就“无处藏身”,查找出现性能问题的环节也就变得非常简单。

相关文章
|
30天前
|
存储 Linux 编译器
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
50 0
|
Linux
【Linux】—— 共享内存
【Linux】—— 共享内存
|
22天前
|
存储 算法 Linux
【Linux 应用开发 共享内存】深入理解和实践 ftruncate:共享内存的有效管理
【Linux 应用开发 共享内存】深入理解和实践 ftruncate:共享内存的有效管理
53 5
|
27天前
|
Shell Linux C语言
【Shell 命令集合 磁盘维护 】Linux 创建一个初始化内存盘 mkinitrd命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建一个初始化内存盘 mkinitrd命令使用教程
33 0
|
11天前
|
Prometheus 监控 Cloud Native
【Linux】查看系统内存命令(详细讲解)
【Linux】查看系统内存命令(详细讲解)
|
15天前
|
存储 缓存 监控
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
|
23天前
|
存储 缓存 监控
Linux 系统 内存通用指标以及查询方式
Linux 系统 内存通用指标以及查询方式
18 0
|
23天前
|
存储 Linux 程序员
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
68 0
|
23天前
|
存储 算法 Linux
深入理解Linux内存管理brk 和 sbrk 与以及使用C++ list实现内存分配器
深入理解Linux内存管理brk 和 sbrk 与以及使用C++ list实现内存分配器
31 0
|
24天前
|
缓存 Linux iOS开发
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
61 1