内存的性能瓶颈主要集中在两点,一个是内存不足,一个是没有充分的利用buffer/cache 。

这里先介绍内存资源不足吧,毕竟应用程序不在 buffer/cache 里读写的可能性不大,除非程序员自己设置直接I/O。否则至少也用的是缓存I/O。当然一些动态链接库也有自己的缓存。

内存回收

当有内存资源不足的时候,就会导致内存回收,也就是释放掉回收的内存,比如buffer/cache 就属于可回收内存,他们在内存管理中叫做文件页(File-backend Page)。大部分的文件页都可以直接回收,以后有需要的时候,再从磁盘重新读取,而那些已经被应用程序改过的,暂时还没有写入磁盘的数据,在内存管理中就叫脏页。需要先写到磁盘中,内存才能得到释放。

当然这些脏页一般通过2种方式写入磁盘,

应用程序中的fsync

内核线程pdflush

除了文件页之外,另一种就是匿名页(Anonymous Page),这些可以是应用程序动态分配的堆内存,这些可以被回收么?当然不能直接回收,要不程序再次访问自己申请的内存时,内存资源突然不见,这可怎么整。但这些内存很少被访问,所以会被放到磁盘中。当再次访问时,会发生主缺页异常(major page faults),再重新加载进内存中。这就是linux中的swap机制。

swap原理

swap说白了就是把一块磁盘空间或者一个本地文件当成内存使用。他包含了换入和换出的两个过程。

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

换入:进程再次访问内存时,从磁盘重新读入内存中。

也就是linux在内存回收方面,做了两件事。

直接内存回收:回收一部分缓存,进而满足新内存的申请请求。

定期内存回收:内核通过kswapd0定期回收内存。

什么时候会定期内存回收

定期回收内存是由内核进程kswapd0来进行的。为了衡量内存的使用情况,kswapd0定义了三个阈值。

内存使用阈值

kswapd0是根据三个阈值进行内存的回收操作的。

当剩余内存小于页最小阈值时,只有内核才可以分配新的内存。

当剩余内存大于页最小阈值并小于页底阈值时,说明此时内存压力巨大,此时wswapd0会一直回收内存,直到内存大于高阈值。

当剩余内存大于页底阈值并小于页高阈值,说明内存存在一定的压力,但还算满足新的内存申请。

当剩余内存大于页高阈值时,说明内存无压力。

当剩余内存小于页底阈值就会触发内存回收,这个页底阈值一般是通过内核选项 /proc/sys/vm/min_free_kbytes 设置。

$ cat /proc/sys/vm/min_free_kbytes

67584

而剩余的两个阈值是由页底阈值计算生成的。

pages_low = pages_min*5/4

pages_high = pages_min*3/2

在 /proc/zoneinfo中可以看到当前的三个阈值

$ cat /proc/zoneinfo

Node 0, zone DMA

pages free 3840

min 69

low 86

high 103

scanned 0

spanned 4095

present 3997

managed 3976

nr_free_pages 3840

nr_alloc_batch 17

nr_inactive_anon 21

nr_active_anon 8

nr_inactive_file 13

nr_active_file 0

这里的 min、low、high是内存页数的阈值。free是剩余内存页数。

nr_zone_active_anon 和 nr_zone_inactive_anon ,分别是活跃和非活跃的匿名页数。

nr_zone_active_file 和 nr_zone_inactive_file ,分别是活跃和非活跃的文件页数。

swap的回收偏向

上面只是说了什么时候会回收内存,但刚才也说到了,内存不够了,一种方式是释放文件页。另一种方式就是将匿名页写入到磁盘(swap)。

两种方式,linux更倾向于哪一种呢?

内核参数 /proc/sys/vm/swappiness 。是用来调整swap的积极性的,也就是说这个参数越高,内存的回收更倾向于swap机制,反则倾向于释放buffer/cache 。但这个参数设置为0 并不代表就不会使用swap了。

swap好吗?

实则根据业务场景,大部分应用都不需要开启swap的。在hadoop,es等java应用其实都是应该关闭swap的,因为java代码在gc时,会遍历所有用到的堆内存,如果这部分内存是在swap上,遍历操作可能就变成磁盘io了。

swap是针对小内存的一种优化,现在的线上服务器动辄128G内存,所以没必要开启swap。如果要开启的话,也是建议将 /proc/swappiness 设置一个较小的值,如10。

另一种场景下,kubernets集群一般会关闭swap。因为开启swap后,通过cgroups设置的内存上限会失效。

响应延迟敏感性的应用如果在开启swap的服务器上运行的话,可以使用库函数 mlock() 或者 mlockall() 锁定内存,阻止内存的换出和换进。

另一个就是numa架构,非一致性内存访问。这个最好也关掉,跨node访问也会造成严重的性能问题。

我的应用开始使用swap了?

既然swap会造成应用程序的性能问题,那么怎么知道我的某个具体的程序开始使用swap了?

$ pidstat -r 1

Linux 3.10.0-957.el7.x86_64 (vm1.centos7.com) 2019年04月05日 _x86_64_ (2 CPU)

09时21分41秒 UID PID minflt/s majflt/s VSZ RSS %MEM Command

09时21分42秒 0 10445 353.85 0.00 108380 1168 0.03 pidstat

pidstat -r 表示的就是单个应用程序的内存使用情况。

minflt/s : 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数。

majflt/s : 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生。

也就是说如果某个应用程序有majflt/s 了,表示其开始使用swap了。其性能当然也会下降。

hadoop集群swap_性能瓶颈--MEM(swap)相关推荐

  1. HADOOP集群优化——CPU、内存、磁盘IO、YARN监控

    目录 hadoop集群优化指标---CPU.内存.磁盘IO.YARN监控 Linux性能监测:CPU篇 Linux性能监测:内存篇 Linux性能监测:磁盘IO篇 Linux性能监测:YARN篇 写在 ...

  2. 大数据Hadoop集群搭建

    大数据Hadoop集群搭建 一.环境 服务器配置: CPU型号:Intel® Xeon® CPU E5-2620 v4 @ 2.10GHz CPU核数:16 内存:64GB 操作系统 版本:CentO ...

  3. FreeBSD下安装配置Hadoop集群(性能调优)

    hadoop的性能调优是个比较艰难的事情,由于这个系统的整个环境比较复杂,对于接触时间不长的人来说,配置都很难,更别说找出性能优化的点了. 性能优化涉及的方面很广,操作系统,网络配置,配置文件,调度器 ...

  4. 唯品会 1000+ 台 Hadoop 集群优化经验

    性能挑战 01 HDFS 是一个分布式系统,只要有足够的资源,可以扩容上千个节点支持100PB以上的集群.我们发现Hadoop集群升级(2.5.0-cdh5.3.2-->2.6.0-cdh5.1 ...

  5. hadoop集群swap_hadoop集群调优-OS和文件系统部分

    OS and File System 根据Dell(因为我们的硬件采用dell的方案)关于hadoop调优的相关说明,改变几个Linux的默认设置,Hadoop的性能能够增长大概15%. open f ...

  6. Hadoop(二)搭建Hadoop集群

    在了解Hadoo基础之后,借助于docker快速实现虚拟化,搭建Hadoop集群,进一步了解Hadoop,实地测试,实地操作,更进一步的了解Hadoop. 首先需要了解Hadoop的各个模块概念已经功 ...

  7. Hadoop是做什么的,hadoop集群搭建作用

    目的 本文描述了如何安装.配置和管理有实际意义的Hadoop集群,其规模可从几个节点的小集群到几千个节点的超大集群. 如果你希望在单机上安装Hadoop玩玩,从这里能找到相关细节. 更多精彩内容 精彩 ...

  8. 同程旅行Hadoop集群跨机房迁移实践

    本文作者:郭飞.现任同程旅行技术专家. Apache Hadoop.Hive.Spark  contributor 背景 随着同程旅行业务和数据规模越来越大,原有的机房不足以支撑未来几年的扩容需求,同 ...

  9. 查看Hadoop集群的基本信息

    1.1查看Hadoop集群的存储系统信息(浏览器查看) http://vincen:50070 configured Capaeity:已配置的文件系统存储总量 DFS Remaining:可使用的D ...

最新文章

  1. JavaScript多线程之HTML5 Web Worker
  2. Harris算子的运用 用于图像配准
  3. 左右TextView旋转门问题
  4. 零窗口探测怎么抓包_超低暗电流高性能近红外硅基光电探测器研究获进展
  5. vagrant系列教程(四):vagrant搭建redis与redis的监控程序redis-stat(转)
  6. java rt_java中rt包中源码了解
  7. BIM新时代背景下的建筑业技术变革
  8. 阿里否认马云辞职;刘强东继续管京东;滴滴开始全程录音 | 极客头条
  9. java判断字符串是否是空格_检查字符串在Java中是否为空格,空(“”)或null
  10. lua-TestMore(转)
  11. java实例化类方法_Java 实例化类的的几种方法
  12. Synergy两台电脑使用同一个鼠标和键盘
  13. jmeter性能测试实战——基础篇
  14. OA常见问题和解决方案
  15. 爬取小鸟高清美女壁纸
  16. react根据中文获取拼音_react-native按照汉字首字母排序
  17. 怎么选择自己合适的LED驱动IC?
  18. win11安装wsl2
  19. mybatis 不确定结果集集_集集丨与小直男的日常(三)
  20. win10的键盘肆无忌惮的乱输入某个字母

热门文章

  1. 23种设计模式之解释器模式
  2. 通过JDBC连接取得数据库相关的元数据
  3. python 面向对象实现CNN(四)
  4. 预加载显示图片的艺术
  5. Android调用WebService
  6. 实用工具篇(三):Free Mybatis plugin
  7. JAVA判断各种类型数据是否为空(亲测)
  8. python软件下载网站
  9. Redis集群-哨兵模式
  10. Git根据commitId查看提交内容:根据commitId查看某次提交的内容