前言

  不知道大家看完前面一章关于CPU优化,是否受到相应的启发呢?如果遇到任何问题,可以留言和一起探讨这方面的问题。接下来我们介绍一些关于内存方面的知识。内存管理软件包括虚拟内存系统、地址转换、交换、换页和分配。与性能密切相关的内容包括:内存释放、空闲链表、页扫描、交换、进程地址空间和内存分配器。在Linux中,空闲链表通常由分配器消耗,如内核的slab分配器和SLUB,以及用户级分配器(glibc,linux系统)libmalloc、libumem和mtmalloc。

  • slab: 内核slab分配器管理特定大小的对象缓存,使他们能够被快速的回收利用,并且避免页分配的开销。适用于处理固定大小结构的内核内存分配。
  • slub: 基于slab分配器。它主要是解决slab分配器带来的问题,其中包括移除对象队列,以及每个CPU缓存,把NUMA优化留给页分配器。
  • glibc: 结合多种非配器策略的高效分配器,它基于分配请求的长度进行分配。较小的分配来自内存集合,包括用伙伴关系算法合并长度相近的单位。较大的分配用树高效地搜索空间。对于非常大的分配,会转到mmap()。

  回收大多是从内核的slab分配器缓存释放内存。这些缓存包含slab大小的未使用内存块,以供充裕。内核页面换出守护进程管理利用换页释放内存。当主存中可用的空闲链表低于阈值时,页面换出守护进程会开始页扫描。页面换出守护进程被称作kswapd(),它扫描非活动和活动内存的LRU页列表以释放页面。它的激活基于空闲内存核两个提供滞后的阈值。一旦空闲内存达到最低阈值,kswapd运行于同步模式,按需求释放内存页。该最低阈值是可调的(vm.min_free_kbytes),并且其他阈值基于它按比例放大。

相关概念

  • 主存:物理内存,描述了计算机的告诉数据存储区域,通常是动态随机访问内存;
  • 虚拟内存: 抽象的主从概念,它几乎是无限的和非竞争性的;
  • 常驻内存:当前处于主存中的内存;
  • 匿名内存:无文件系统位置或者路径名的内存。它包括进程地址空间的工作数据,称作堆;
  • 地址空间:内存上下文。每个进程和内核都有对应的虚拟地址空间;
  • 页:操作系统和CPU使用的内存单位。它一直以来是4KB和8KB。现代的处理器允许多种页大小以支持更大的页面尺寸,以及更大的透明大页;
  • 缺页:无效的内存访问;
  • 换页:在主存与存储设备间交换页;
  • 交换:指页面从主从转移到交换设备(迁移交换页);
  • 交换(空间):存放换页的匿名数据和交换进程的磁盘空间;

  进程地址空间是一段范围的虚拟页,由硬件和软件同事管理,按需映射到物理页。这些地址被划分为段以存放线程栈、进程可执行、库和堆。应用程序可执行段包括分离的文本和数据段。库也由分离的可执行文本和数据段组成。分别如下:

  • 可执行文本:包括可执行的进程CPU指令。由文件系统中的二进制应用程序文本映射而来。它是只读的并带有执行的权限。
  • 可执行数据:包括已初始化的变量,由二进制应用程序的数据段映射而来。有读写权限,因此这些变量在应用程序的运行过程中可以被修改。
  • 堆:应用程序的临时工作内存并且是匿名内存。它按需增长并且用mollac()分配。
  • 栈:运行中的线程栈,映射为读写。

  对于内存而言,经常关注的信息如下:

  • 页扫描:寻找连续的页扫描(超过10秒),它是内存压力的预兆。可以使用sar -B并查看pgscan列。
  • 换页:换页是系统内存低的进一步征兆。可以使用vmstat 并查看si(换入) 和 so(换出)列。
  • 可用内存:查看和关注buffer和cache值;
  • OOM终结者:在系统日志/var/log/messages或者dmesg中查看,直接搜索"Out of memory";
  • top/prstat:查看那些进程和用户是常驻物理内存和虚拟内存的最大使用者;
  • stap/perf:内存分配的栈跟踪,确认内存使用的原因;

  如何快速定位内存故障?
  1. 首先应该检查饱和度(作为释放内存压力的衡量,页扫描、换页、交换和Linux OOM终结者牺牲进度的使用程度),因为持续饱和状态是内存问题的征兆。这些指标可以通过vmstat、sar、dmesg等操作系统工具轻易获得。对于配置了独立磁盘交换设备的系统,任何交换设备活动都是内存压力的征兆。

  2. 使用率(使用内存和可用内存,物理内存和虚拟内存都应该关注)通常较难读取和解读。比如一个系统可能会报告只有几十兆内存可用,但事实上它有10GB的文件系统缓存在,需要时立刻被应用程序回收利用。虚拟内存使用,这应该也是我们关注的一个点。

  3. 内存错误(Out of memory)一般都是由应用程序报告。

关于内存性能排查命令

vmstat

[root@zbredis-30104 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0    0 14834208 158384 936512    0    0     0     0    1    3  0  0 100  0  0

提示:

  swpd:交换处的内存量;
  free:空闲的可用内存;
  buff: 用户缓冲缓存的内存;
  cache: 用于页缓存的内存;
  si: 换入的内存(换页);
  so:换出的内存(换页);

如果si 和 so列一直非0,那么系统正存在内存压力并换页到交换设备或文件。经常使用参数为"vmstat 1 -Sm"和"vmstat -a 1";

sar

  -B: 换页统计信息;

  -H: 大页面统计信息
  -r: 内存使用率
  -R:内存统计信息
  -S:交换空间统计信息
  -W:交换统计信息

slabtop

  通过slab分配器实时输出内核slab缓存使用情况;

[root@localhost ~]# slabtop -scActive / Total Objects (% used)    : 297064 / 300262 (98.9%)
Active / Total Slabs (% used)      : 6638 / 6638 (100.0%)
Active / Total Caches (% used)     : 66 / 96 (68.8%)
Active / Total Size (% used)       : 80612.41K / 81749.09K (98.6%)
Minimum / Average / Maximum Object : 0.01K / 0.27K / 8.00KOBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME
7648   7528  98%    2.00K    478     16     15296K kmalloc-2048
65142  65142 100%    0.19K   1551    42     12408K dentry
17985  17985 100%    0.58K    327    55     10464K inode_cache
7110   7110 100%    1.06K    237     30  7584K xfs_inode
10880  10160  93%    0.50K    170    64  5440K kmalloc-512
30564  30564 100%    0.11K    849    36  3396K sysfs_dir_cache

输出包括顶部的汇总和slab列表。其中包括对象数量(OBJS)、多少是活动的(ACTIVE)、使用百分比(USE)、对象大小(OBJ SIZE,字节)和缓存大小(CACHE SIZE,字节)。

ps

  可以列出包括内存使用统计信息在内的所有进程细节;

  %MEM: 主存使用(物理内存、RSS)占总内存的百分比;
  RSS:常驻集合大小;
  VSZ: 虚拟内存大小;

提示:RSS显示主存使用,它也包括如系统库在内的映射共享段,可能会被几十个进程共享。如果你把RSS列求和,会发现她超过系统内存总和,这是由于重复计算了这部分共享内存。

pmap

[root@localhost ~]# pmap -x 1096
1096:   /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000   11960    3468       0 r-x-- mysqld
00000000011ae000     668     240     172 r---- mysqld
0000000001255000    1028     364     208 rw--- mysqld
0000000001356000     340     312     312 rw---   [ anon ]
0000000001887000    7508    7344    7344 rw---   [ anon ]
...省略部分...
00007ffc659e9000     132      72      72 rw---   [ stack ]
00007ffc65ba1000       8       4       0 r-x--   [ anon ]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB          961172  121756  116468

内存优化

首先关于内核优化的相关参数

vm.dirty_background_bytes:默认值为0, 触发pdflush后台回写的脏存储器量;

vm.dirty_background_ratio:默认值10, 触发pdflush后台回写脏系统存储器百分比;
vm.dirty_bytes:默认值为0,触发一个写入进程开始回写的脏存储器量;
vm.dirty_ratio:默认值为20,触发一个写入进程开始回写的脏系统存储器比例;
vm.dirty_expire_centisecs:默认值为3000,使用pdflush的脏存储器最小时间;
vm.dirty_writeback_centisecs:默认值为500,pdflush活跃时间间隔(0为停用);
vm.min_free_kbytes:默认值为 dynamic,设置期望的空闲存储器量(一些内核自动分配器能消耗它);
vm.overconmmit_memory:默认值为0,0表示利用探索法允许合理的国度分配;1表示一直国度分配;3表示禁止国度分配;
vm.swappiness:默认值为60,相对于页面高速缓存回收更倾向用交换释放存储器的程度;
vm.vfs_cache_pressure:默认值为100,表示回收高速缓存的目录和inode对象的程度。较低的值会保留更多;0意味着从不回收,容器导致存储器耗尽的情况;

提示:

vm.dirty_background_bytes和vm.dirty_background_ratio是互斥的,dirty_bytes 和 dirty_ratio 也是如此,仅能设置一个。vm.swappiness参数对性能会产生显著的影响,建议设置为0;因为应用程序内存能尽可能就地驻留。

最后说明,在现在内核发展过程之中,linux内存页面已经支持大页面和超大页面以及透明大页面等,可以根据自身环境进行适当的调整。红帽企业版 Linux 6 采用第二种方法,即使用超大页面。简单说,超大页面是 2MB 和 1GB 大小的内存块。2MB 使用的页表可管理多 GB 内存,而 1GB 页是 TB 内存的最佳选择。

超大页面必须在引导时分配。它们也很难手动管理,且经常需要更改代码以便可以有效使用。因此红帽企业版 Linux 也部署了透明超大页面 (THP)。THP 是一个提取层,可自动创建、管理和使用超大页面的大多数方面。
THP 系统管理员和开发者减少了很多使用超大页面的复杂性。因为 THP 的目的是改进性能,所以其开发者(社区和红帽开发者)已在各种系统、配置、程序和负载中测试并优化了 THP。这样可让 THP 的默认设置改进大多数系统配置性能。
注:THP 目前只能映射异步内存区域,比如堆和栈空间。关于THP相关使用及问题可自行查阅资料。

转载于:https://www.cnblogs.com/yangxiaoyi/p/7537949.html

Linux性能优化之内存优化(二)相关推荐

  1. App性能优化(布局优化,线程优化,app瘦身优化,页面切换优化,App启动优化,内存优化)

    Android APP性能优化(最新总结) 在目前Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性.复杂度也随之增长,这样使得UI布局的优化,显得至关重要 ...

  2. Lua性能优化—Lua内存优化

    原文链接https://blog.uwa4d.com/archives/usparkle_luaperformance.html 这是侑虎科技第236篇原创文章,感谢作者舒航供稿,欢迎转发分享,未经作 ...

  3. Android 系统性能优化(55)---Android 性能优化之内存优化

    Android 性能优化之内存优化 前言 Android App优化这个问题,我相信是Android开发者一个永恒的话题.本篇文章也不例外,也是来讲解一下Android内存优化.那么本篇文章有什么不同 ...

  4. Android性能优化之内存优化 1

    导语 智能手机发展到今天已经有十几个年头,手机的软硬件都已经发生了翻天覆地的变化,特别是Android阵营,从一开始的一两百M到今天动辄4G,6G内存.然而大部分的开发者观看下自己的异常上报系统,还是 ...

  5. Linux性能调优的优化思路

    Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台,在这个平台下有无数的开源软件支撑,我们常见的有apache.tomcat.nginx.mysql.php等等,开源软件的最大理念就是 ...

  6. 第八章 性能优化 之 内存优化(一)

    文章目录 (一)Android内存泄露 1.Java内存基础知识 1.1)JVM(java虚拟机:java程序运行环境)内存--栈.堆.方法区 1.2)垃圾回收机制 (1)什么是垃圾回收机制? (2) ...

  7. android—性能优化2—内存优化

    文章目录 性能优化: 工具: memory profiler LeakCanary arthook epic 库 java内存管理机制 java 内存回收机制 Android内存管理机制 Dalvik ...

  8. Android App性能优化之内存优化

    为什么要进行内存优化? 1.App运行内存限制,OOM导致App崩溃 2.App性能:流畅性.响应速度和用户体验 Android的内存管理方式 Android系统内存分配与回收方式 ●   一个App ...

  9. Unity3D性能优化 之 内存优化篇

    性能优化主要围绕CPU.GPU和内存三大方面 之 内存优化篇 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重. 然而,在我们测评过的大量项目中,90%以上的项目都存在不同程度的内存使用问题. ...

  10. Android面试-Android性能优化和内存优化、APP启动速度一线大厂的实战案例解析

    一.Android 内存管理机制 二.优化内存的意义 三.避免内存泄漏 四.优化内存空间 五.图片管理模块的设计与实现 六.总结 深入探索Android内存优化 第一章.重识内存优化 第二章.常见工具 ...

最新文章

  1. 【RecyclerView】二、RecyclerView 简介 ( RecyclerView 特点 | RecyclerView 涉及到的类 )
  2. CMU Facebook论文解读 | 非局部神经网络(附代码实现)
  3. 看你知道不知道之-制作数据字典
  4. 【vue】跟着老马学习vue-数据双向绑定
  5. mysql 创建数据库文件_mysql学习之通过文件创建数据库以及添加数据
  6. Qt工作笔记-Qt元对象系统解析【2合1】
  7. python入门-windows下anaconda环境搭建
  8. 是谁开发出手机曲面屏这种“反人类设计”?
  9. java webservice 异常_java异常webservice
  10. 将中文版pycharm改成英文版
  11. linux基础期末考试免费,linux基础期末考试试题.doc
  12. oracle mysql认证考试流程_oraclemysql认证的考试流程有些什么
  13. IT资源专业搜索-www.easysoo.cn
  14. Shell脚本之shift用法
  15. 笔记本计算机回收站在哪里,笔记本电脑如何设置回收站自动清空
  16. csgo服务器搭建(linux)
  17. 电能管理系统在中材萍乡水泥4500t/d生产线改造上的应用
  18. 用vue3.0.1如何搭建仿京东的电商H5项目呢?本文实战教你
  19. Deployer php自动部署,简单轻松部署你的项目 - Deployer
  20. 数字信号处理(一)绪论

热门文章

  1. Mongodb~连接串的整理
  2. 在VMW里安装Ghost操作系统遇到的问题及解决的办法
  3. BenchmarkSQL 测试Oracle 12c TPC-C 性能
  4. 《Two Dozen Short Lessons in Haskell》学习(三)
  5. 在主函数中输入10个等长的字符串。用另一函数对他们排序。
  6. jBPM与业务系统集成-通过定制Task Instance等方式实现
  7. vue 双向数据绑定
  8. Nginx 场景应用
  9. JsSIP 注册,拨打填坑
  10. 如何防范和应对Redis勒索,腾讯云教你出招