18888889999
notice 网站公告
— 杏彩体育资讯 —
上篇文章说了我们性能优化的CPU维度的优化方向,及CPU指标的基本知识 性能优化CPU篇,本文我们着手,从内存的角度讲解一下优化的方向。
日常生活常说的内存是什么
虚拟地址空间 Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。 这样,进程就可以很方便 地访问内存,更确切地说是访问虚拟内存。
虚拟地址空间内部
虚拟地址空间的内部又被分为 和 两部分
不同字长(单个 CPU 指令可以处理数据的最大长度)的处理器,地址空间的范围也不同,例如32位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间 而 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的
进程的用户态和内核态 进程在用户态时,只能访问用户空间内存;只有进入内核态后,才可以访问内核空间内存。虽然每个进程的地址空 间都包含了内核空间,但这些内核空间,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很 方便 地访问内核空间内存。 为什么会有内存映射 既然每个进程都有一个这么大的地址空间,那么所有进程的虚拟内存加起来,自然要比实 际的物理内存大得多。 所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使 用的虚拟内存才分配物理内存,并且分配后的物 理内存,是通过内存映射来管理的。 什么是内存映射 内存映射,其实就是将虚拟内存地址映射到物理内存地址。为了完成内存映射,内核为每 个进程都维护了一张页 表,记录虚拟地址与物理地址的映射关系,如下图所示:
Swap 是把一块磁盘空间或者一个本地文件,当成内存来使用。它包括换出和换入两个过程。
一个很典型的场景就是,即使内存不足时,有些应用程序也并不想被 OOM 杀死,而是希望能缓一段时间,等待人工介入,或者等系统自动释放其他进程的内存,再分配给它。除此之外,我们常见的笔记本电脑的休眠和快速开机 的功能,也基于 Swap 。休眠时,把系统的内存存入磁盘,这样等到再次开机时,只要从磁盘中加载内存就可以。 这样就省去了很多应用程序的初始化过程,加快了开机速度。话说回来,既然 Swap 是为了回收内存,那么 Linux 到底在什么时候需要回收内存呢?前面一直在说内存资源紧张,又该怎么来衡量内存是不是紧张呢?
一个最容易想到的场景就是,有新的大块内存分配请求,但是剩余内存不足。这个时候系统就需要回收一部分内 存,进而尽可能地满足新内存请求。这个过程通常被称为 直接内存回收。
除了直接内存回收,还有一个专门的内核线程用来 定期回收内存 ,也就是 kswapd0。为了衡量内存的使用情况, kswapd0 定义了三个内存阈值(watermark,也称为水位),分别是页最小阈值(pages_min)、页低阈值 (pages_low)和页高阈值(pages_high)。剩余内存,则使用 pages_free 表示
kswapd0 定期扫描内存的使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存的回收操作。
所有数值默认都是以字节(kb)为单位
free=total - used - shared - buffcache
例:每隔 2s 输出一次统计信息,总共输出 2 次,并且人性化输出所有数值
内存性能指标
如已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量等。
已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存。
共享内存是通过 tmpfs (内存的文件系统 )实现的,所以它的大小也就是 tmpfs 使用的内存大小。tmpfs 其实
也是一种特殊的缓存。
可用内存是新进程可以使用的最大内存,它包括剩余内存和可回收缓存。
缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的
速度。另一部分,则是 Slab 分配器中的可回收内存。
来,统一优化磁盘写入。
2.进程内存使用情况 比如进程的虚拟内存、常驻内存、共享内存以及 Swap 内存等
已经申请的内存,即使还没有分配物理内存,也算作虚拟内存。
常驻内存是进程实际使用的物理内存,不过,它不包括 Swap 和共享内存。
共享内存,既包括与其他进程共同使用的真实的共享内存,还包括了加载的动态链接库以及程序的代码段等
Swap 内存,是指通过 Swap 换出到磁盘的内存
3.缺页异常
系统调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异
常来分配。缺页异常又分为下面两种场景。
可以直接从物理内存中分配时,被称为次缺页异常。
需要磁盘 I/O 介入(比如 Swap)时,被称为主缺页异常。
4.Swap 的使用情况
如 Swap 的已用空间、剩余空间、换入速度和换出速度等
已用空间和剩余空间很好理解,就是字面上的意思,已经使用和没有使用的内存空间。
换入和换出速度,则表示每秒钟换入和换出内存的大小。
常见的优化思路有这么几种。
1)最好禁止 Swap。如果必须开启 Swap,降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。
2)减少内存的动态分配。比如,可以使用内存池、大页(HugePage)等。
3)尽量使用缓存和缓冲区来访问数据。比如,可以使用堆栈明确声明内存空间,来存储需要缓存的数据;或者用
Redis 这类的外部缓存组件,优化数据的访问。
4)使用 cgroups 等方式限制进程的内存使用情况。这样,可以确保系统内存不会被异常进程耗尽。
5)通过 /proc/pid/oom_adj ,调整核心应用的 oom_score。这样,可以保证即使内存紧张,核心应用也不会被 OOM杀死。
如有需求请您联系我们!
地址:海南省海口市58号
电话:18888889999
手机:海南省海口市58号
Copyright © 2012-2018 首页-杏彩体育中国官方网站 版权所有 ICP备案编:琼ICP备88889999号