jasper的技术小窝

关注DevOps、运维监控、Python、Golang、开源、大数据、web开发、互联网

性能调优之内存篇

作者:jasper | 分类:Linux | 标签:   | 阅读 694 次 | 发布:2017-01-15 6:30 p.m.

这一章终于可以来讲讲内存了,最近在coding中也总是会遇到一些内存的问题,因为我们知道磁盘的处理数据比内存要低几个数量级,一旦主存填满,系统可能会在主存和这些存储设备之间交换数据,也叫作swap,这是一个缓慢的过程,常常成为系统的瓶颈,严重影响性能。所以对于内存的优化就显得尤其重要。

1、基本概念

1.1、虚拟内存

为每个进程和内核提供巨大的、线性的并且私有的地址空间,将物理内存的分配交给操作系统管理,大多数虚拟内存都是以页的方式实现的。进程的地址空间由虚拟内存子系统映射到主内存和物理交换设备,内核会按需在它们之间移动内存页,这个过程即为swap。

1.2、换页

换页是将页面换入和调出主存,分别被称为页面换入和换出,换页有两种类型:文件系统换页和匿名换页。

  • 文件系统:由读写位于内存中的映射文件引发,对于使用mmap的应用程序和使用了页缓存的文件系统,这是正常的行为。
  • 匿名换页:牵扯进程的私有数据:进程堆和栈。linux中用swap来命名这种类型的换页。

1.3、按需换页

将虚拟内存按需映射到物理内存,这回把CPU创建映射的开销推迟到实际需要或是访问时,而不是在初次分配这部分内存时。这结果就是任何虚拟内存可能处在如下的状态:

A、未分配 B、已分配、未映射 C、已分配、已映射到主存 D、已分配、已映射到物理物理交换空间(磁盘)

其中:

  • 常驻集合大小(RSS):即为C的大小;
  • 虚拟内存大小:B+C+D

1.4、过度提交

linux允许分配超过系统可以存储的内存——超过物理内存和交换设备的总和。

1.5、文件系统缓存占用

操作系统会将可用内存用于文件系统缓存以提高性能,原则是如果有可用主内存,就有效地利用它。当应用程序需要的时候,内核能够很快从文件系统缓存中释放内存。

1.6、使用率和饱和率

主内存的使用率可由已占用的内存除以总内存得出。文件系统缓存占用的内存可以看作未使用。

1.7、字长

处理器支持多种字长,32位和64位;地址空间受限于字长的寻址空间,因此32位的地址空间放不下需要4GB以上的应用程序。

2、架构

  • 硬件:内存硬件包括主存、总线、CPU缓存和MMU;
  • 软件:包括内存释放、空闲链表、页扫描、交换、进程地址空间和内存分配器;

3、方法

3.1、工具法

  • 页扫描:使用sar -B来检查pgscan;
  • 换页:vmsstat检查si和so列;
  • OOM终结者:在日志/var/log/messages,或者从dmesg中找到,搜索“Out of memory”;
  • top:查看哪些用户和进程是常驻物理内存和虚拟内存的最大使用者;

3.2、USE方法

使用率、饱和度、错误

3.3、特征归纳

主要用于发现错误的配置,用于促成最大的性能提升。

3.4、泄露检测

注意内存泄露和内存增长是两个不同的概念,不要混淆;

3.5、静态资源调优

  • 主存多少?
  • 配置允许应用程序使用多少主存?
  • 应用程序使用什么分配器?
  • 主存的速度?是否是可用的最快类型?
  • 系统的架构是什么?NUMA、UMA?
  • 操作系统支持NUMA么?
  • 有多少内存总线?
  • CPU缓存的数量和大小?
  • 是否支持过度提交?

4、调优

4.1、可调参数

以下可通过sysctl设置: 注意:dirty_background_bytes和dirty_background_ratio是互斥的,dirty_bytes和dirty_ratio也是,只能设置一个。其中vm.min_free_kbytes动态设置为主存的一小部分,虽然降低可以释放一些内存,但是这样也会导致内核在内存压力下不堪重负而过早OOM;vm.overcommit_memory设置为2可以禁止过度提交;vm.swappiness取值范围0-100,设为0比较可取,因为应用程序内存能尽可能久的驻留,但这是以页面缓存为代价的,特别提醒这并不是说禁用swap!

4.2、多个页面大小

更大的页面能通过提高TLB缓存命中率来提升内存IO性能。设置方法grep Huge /proc/meminfo 你就知道啦。

4.3、资源控制

可用ulimit实现:

  • memory.memsw.limit_in_bytes:允许的最大内存和交换空间;
  • memory.limit_in_bytes:允许的最大用户内存、包括文件缓存;
  • memory.swappiness:类似前面的vm.swappiness,差别在于可以设置cgroup;
  • memory.oom_control:设为0,允许OOM终结者运用这个cgroup,或是设置为1,禁用。


转载请注明出处:http://www.opscoder.info/mem_performance.html

【上一篇】 性能调优之CPU篇
【下一篇】 Golang性能分析工具pprof
其他分类: