Linux性能优化实战:系统的swap变高(08)

一、Swap 原理

前面提到,Swap 说白了就是把一块磁盘空间或者一个本地文件(以下讲解以磁盘为例),当成内存来使用。它包括换出和换入两个过程

1、所谓换出

就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。

2、换入

则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来

所以你看,Swap 其实是把系统的可用内存变大了。这样,即使服务器的内存不足,也可以运行大内存的应用程序

3、应用场景

即是内存不足时,有些程序也并不像被OOM杀死,二十希望能缓一段时间,等待人工介入,或者等系统自动释放其他程序的内存,再分配给它(可以给运维人员处理故障一个缓冲的时间)

常见的笔记本电脑休眠和快速开机的功能,也基于Swap ,休眠时,把系统内存存入磁盘,这样等到再次开机时,只要从磁盘中加载内存就可以,这样就省去了很多应用程序的初始化过程,加快了开机速度

二、那么 Linux 到底在什么时候需要回收内存呢?

1、直接内存回收

有新的大块内存分配请求,但是剩余内存不足,这个时候系统就需要回收一部分内存(比如前面提到的缓存),进而尽可能地满足新内存请求,这个过程被称为直接内存回收

2、kswapd0(定期回收内存)

1、剩余内存页<最小阈值

[email protected]:~#  free -h
              total        used        free      shared  buff/cache   available
Mem:           4.9G        114M        4.0G        992K        770M        4.5G
Swap:          3.9G          0B        3.9G
[email protected]:~# cat /proc/sys/vm/min_free_kbytes
67584

说明进程可用内存都耗尽了,只有内核才可以分配内存

2、页最小阈值<剩余内存页<页低阈值

内存压力比较大,剩余内存不多了,这是kswapd0会执行内存回收,直接剩余内存大于高阈值为止

3、页低阈值<剩余内存<页高阈值

说明有一定压力,但还可以满足新内存请求

4、剩余内存>页高阈值

说明剩余内存比较多,没有内存压力

watch -d grep -A 15 ‘Normal‘ /proc/zoneinfo
Every 2.0s: grep -A 15 Normal /proc/zoneinfo                                                                              openstack: Wed Feb  6 08:45:01 2019

Node 0, zone   Normal
  pages free     146583
        min      4986
        low      6232
        high     7478
        spanned  399872
        present  399872
        managed  373102
        protection: (0, 0, 0, 0, 0)
      nr_free_pages 146583
      nr_zone_inactive_anon 35
      nr_zone_active_anon 11422
      nr_zone_inactive_file 64699
      nr_zone_active_file 120441
      nr_zone_unevictable 1352
      nr_zone_write_pending 0 

三、为什么剩余内存很多的情况下,也会发生 Swap 呢?

这正是处理器的 NUMA (Non-Uniform Memory Access)架构导致的。

在 NUMA 架构下,多个处理器被划分到不同 Node 上,且每个 Node 都拥有自己的本地内存空间。

而通一个Node内部的内存空间实际上可以进一步分为不同的内存域。比如直接内存访问区域、普通内存区,伪内存去等如下图所示

1、通过numactl查询node的分布情况

[email protected]:~# numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1
node 0 size: 4976 MB
node 0 free: 4088 MB
node distances:
node   0
  0:  10

1、NUMA和swap什么关系?

1、三个内存阈值(页最小阈值、页低阈值和页高阈值)查询

cat  /proc/zoneinfo
Node 0, zone   Normal
  pages free     146583
        min      4986
        low      6232
        high     7478
        spanned  399872
        present  399872
        managed  373102
        protection: (0, 0, 0, 0, 0)
      nr_free_pages 146583
      nr_zone_inactive_anon 35
      nr_zone_active_anon 11422
      nr_zone_inactive_file 64699
      nr_zone_active_file 120441
      nr_zone_unevictable 1352
      nr_zone_write_pending 0 

1、pages 处的 min、low、high,就是上面提到的三个内存阈值,而 free 是剩余内存页数,它跟后面的nr_free_pages 相同

2、nr_zone_active_anon 和 nr_zone_inactive_anon,分别是活跃和非活跃的一名页数

3、nr_zone_active_file 和 nr_zone_inactive_anon,分别是活跃和非活跃的文件页数

从这个输出结果可以发现,剩余内存远大于高阈值,所以此时的不会回收内存

2、Node寻找空闲内存还是本地内存中回收内存?

[email protected]:~# cat /proc/sys/vm/zone_reclaim_mode
0

默认的0,也就是刚刚提到的模式,表示既可以从其他Node寻找空闲内存,也可以从本地回收内存

1、1、2、4都表示只回收本地内存,
2、2表示可以回写脏数据回收内存
3、4表示可以用方式回收

3、到底该先回收哪一种呢?

1、对文件页的回收

当然就是直接回收缓存,或者把脏页写回磁盘后再回收

2、而对匿名页的回收

其实就是通过 Swap 机制,把它们写入磁盘后再释放内存

[email protected]:~#  cat /proc/sys/vm/swappiness
60

swappiness 的范围是 0-100,数值越大,越积极使用Swap,更倾向于回收匿名页

也就是更倾向于回收匿名页;数值越小,越消极使用 Swap,也就是更倾向于回收文件页

虽然swappiness的范围是0-100,不过要注意,这并不是内存的百分比,而是Swap调整积极程度的权重

即使你把它设置成0,当剩余内存+文件页小于也高阈值时,还是会发生Swap

原文地址:https://www.cnblogs.com/luoahong/p/10353819.html

时间: 02-04

Linux性能优化实战:系统的swap变高(08)的相关文章

Linux性能优化之CPU优化(一)

前言 何为性能优化?个人认为,性能优化是为了提高应用程序或系统能力为目的.那么如何才能实现对应用程序的性能调优呢?这里很设计到很多的内容,包括Linux内核.CPU架构以及Linux内核对资源的分配以及管理,了解进程的创建过程等.这方面由于篇幅较多,所以我的文章就不过多介绍.接下来的几篇文章中,都是讲解如何发现应用程序故障根源为目标讲解,这也是每一个系统工程师应该具备的能力.废话不多说,我直接进入主题. 常用术语 延时:延时是描述操作之后用来等待返回结果的时间.在某些情况下,它可以指的是整个操作

android性能优化实战理论篇

本文地址:http://blog.csdn.net/iamws/article/details/51636175 第二篇:理论 通过之前前篇介绍的工具,我们知道了应该怎么样去获取要分析的数据,但是也仅仅局限在于怎么样获取数据,而没有深入数据分析,这一篇主要讲解的是UI刷新这块部分android理论知识,有了这些知识后,对于上面的数据该怎么分析,你就胸有成竹了. ps:本文只是个人理解后的总结,并不会深入源码层次分析,如有错误,还请麻烦各位帮忙指正~ 这篇文章要解决的理论问题如下: 1.什么是内存

Android ListView性能优化实战方案

前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListView进行性能优化,不仅是面试中常常会被问到的(我前段时间面试了几家公司,全部都问到了这个问题了),而且在实际项目中更是非常重要的一环,它甚至在某种程度上决定了用户是否喜欢接受你的APP.(如果你的列表滑起来很卡,我敢说很多人会直接卸载) 网上关于如何对ListView进行性能优化,提出了很多方案.但

性能优化实战案例——助力某移动OA系统

系统情况 硬件配置 软件情况 数据库情况 系统情况可以看出,这是一个较小型的OA系统数据大小70G,硬件配置较为普通2路16CPU.48G内存,数据库为2008R2版本. 数据库指标 我们来看一下数据库的性能相关情况:数据是从早上九点半到晚上8点的数据 每秒请求数: 用户连接数 慢语句数量 系统等待情况 等待时间 CPU.内存.磁盘指标一切正常,还有很多指标,这里就不贴图了www.qwangxiao.com. 其实看到这里,大多数看官可以得出结论,硬件指标正常,阻塞这么严重,系统的慢主要是因为阻

Linux性能优化之磁盘优化(三)

前言 关于本章内容,设计的东西比较多.这里会有关于文件系统.磁盘.CPU等方面的知识,以及涉及到关于这方面的性能排查等. 术语 文件系统通过缓存和缓冲以及异步I/O等手段来缓和磁盘的延时对应用程序的影响.为了更详细的了解文件系统,以下就简单介绍一些相关术语: 文件系统:一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问.另外,一些表示设备.套接字和管道的特殊文件类型,以及包含文件访问时间戳的元数据. 文件系统缓存:主存(通常是DRAM) 的一块区域,用来缓存文

Linux性能优化工具之gprof简记

gprof工作方式 在使用gcc编译时指定-pg选项,编译器在用户代码中插入性能测试代码. gprof简单应用实例 main.c #include <stdio.h> #include "lib.h" int main(void) { func1(20); func2(100); return 0; } lib.h #ifndef LIB_H #define LIB_H void func1(int i); void func2(int i); #endif /* LIB_

Web 前端性能优化实战

基础知识 了解从地址栏输入URL到页面加载完成整体过程 DNS域名解析 TCP连接 HTTP请求 处理请求返回HTTP响应 页面渲染 关闭连接 分析项目 项目部署环境:美国服务器 webpagetest是一款非常优秀的网页前端性能测试工具,用它来测试生产环境上的项目 由上面的概览最直观的就可以看出以下问题: 1.图片没处理 2.没有缓存静态内容 3.没有使用CDN 4.加载时间长 5.http请求过多 再看看Performance Review 6.存在404资源 分析问题 1.图片没处理 首页

PLSQL_性能优化系列16_Oracle High Water Level高水位分析

2014-10-04 BaoXinjian 一.摘要 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至关重要的影响. 当使用delete 操作表记录时,高水位线并不会下降,随之导致的是全表扫描的实际开销并没有任何减少. 本文给出高水位线的描述,如何降低高水位线,以及高水位线对全表扫描的影响. 1. 何谓高水位线 如前所述,类似于水库中储水的水位线.只不过在数据库中用于描述段的扩展方式. 可以将数据段或索引段等想象为一个从左到右依次排开的一系列块.当这些块

Linux性能与优化(一)

一.影响Linux服务器性能的因素 1. 操作系统级 CPU 内存 磁盘I/O带宽 网络I/O带宽 2. 程序应用级 二.系统性能评估标准 影响性能因素 评判标准 好 坏 糟糕 CPU user% + sys%< 70% user% + sys%= 85% user% + sys% >=90% 内存 Swap In(si)=0 Swap Out(so)=0 Per CPU with 10page/s More Swap In & Swap Out 磁盘 iowait % < 20

15套java互联网架构师、高并发、集群、负载均衡、高可用、数据库设计、缓存、性能优化、大型分布式 项目实战视频教程

* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat