linux 内存管理 page fault带来的性能问题

news2024/3/4 12:16:27

Linux进程如何访问内存

Linux下,进程并不是直接访问物理内存,而是通过内存管理单元(MMU)来访问内存资源。
原因后面会讲到。

为什么需要虚拟内存地址空间

假设某个进程需要4MB的空间,内存假设是1MB的,如果进程直接使用物理地址,这个进程会因为内存不足跑不起来。
既然进程不是直接访问物理内存,那么进程中涉及的内存地址当然也不是物理内存地址。
而是虚拟的内存地址,虚拟的内存地址和物理的内存地址之间保持一种映射关系,这种关系由MMU进行管理。
每个进程都有自己独立的虚拟地址空间。

什么是MMU


MMU全称是内存管理单元,它将物理内存分割成多个pages,MMU管理进程的虚拟地址空间中的PAGE和物理内存中的PAGE之间的映射关系。
因为是映射,所以随时都可能发生变化,例如某个进程虚拟内存空间中的PAGE1,在不同的时间点,可能出现在物理内存中的不同位置(当发生了页交换时)。

什么是page fault

当进程访问它的虚拟地址空间中的PAGE时,如果这个PAGE目前还不在物理内存中,此时CPU是不能干活的,
Linux会产生一个hard page fault中断。
系统需要从慢速设备(如磁盘)将对应的数据PAGE读入物理内存,并建立物理内存地址与虚拟地址空间PAGE的映射关系。
然后进程才能访问这部分虚拟地址空间的内存。

page fault 又分为几种,major page fault、 minor page fault、 invalid(segment fault)。

major page fault也称为hard page fault, 指需要访问的内存不在虚拟地址空间,也不在物理内存中,需要从慢速设备载入。从swap回到物理内存也是hard page fault。

minor page fault也称为soft page fault, 指需要访问的内存不在虚拟地址空间,但是在物理内存中,只需要MMU建立物理内存和虚拟地址空间的映射关系即可。
(通常是多个进程访问同一个共享内存中的数据,可能某些进程还没有建立起映射关系,所以访问时会出现soft page fault)

invalid fault也称为segment fault, 指进程需要访问的内存地址不在它的虚拟地址空间范围内,属于越界访问,内核会报segment fault错误。

什么是进程的working set

进程的working set是指当前在物理内存中,属于该进程的pages组成的集合。
这个集合中的page数随着系统的运行,可能扩大也可能缩小。
扩大working set是指进程正在访问更多的内存时。
缩小working set是指其他进程正在访问更多的内存,并且整个物理内存的空间不足,需要将某些干净的内存页free掉或者一些脏的内存页swap到交换分区去,如果这个操作设计到当前进程,对当前进程来说就是shrink working set。
缩小working set需要遵循lru (内核的内存老化)算法,并不是随便挑选PAGE进行shrink的。

什么是swap

swap和前面提到的shrink working set有关,如果是干净页(即从读入虚拟地址空间后,没有修改过的页),则直接标记为free,不需要写盘,也不会发生swap。
如果是脏页,那么它需要写盘,或者需要swap 到交换分区。

如何优化swap

建议使用IOPS和读写带宽很高的盘作为SWAP分区,例如PCI-E SSD。

什么时候需要加内存

如果你发现经常发生swap in , out。
说明进程的脏页被换出到swap后,紧接着这些页可能又需要被进程访问,从而这些页需要从swap写入物理内存,发生了hard page fault。
这种情况下,你就需要加内存了,确实是内存不够用了。
hard page fault非常损耗性能,因为发生page fault时,是需要等待的,而且IO通常来说都是比较慢的,容易成为性能瓶颈。

什么是oom, 为什么会发生OOM

前面讲到了shrink working set,是指系统在内存调度时,使用的一种手段,尽可能的让系统能使用有限的内存资源,支撑更多的并发任务。
oom是指系统已经没有足够的内存给进程使用,即能free的都已经free了,能swap out的也已经swap out了,再也不能挤出物理内存的情况。
如果遇到这种情况就会发生OOM,表示系统内存以及不足,Linux会挑选并KILL一些进程,来释放内存。

Linux page相关统计信息

sar命令

Report paging statistics.  The following values are displayed:

pgpgin/s
       Total number of kilobytes the system paged in from disk per second.

pgpgout/s
       Total number of kilobytes the system paged out to disk per second.

fault/s
       Number of page faults (major + minor) made by the system per second.  This is not a count of page faults that generate I/O, because some page faults can be resolved without I/O.

majflt/s
       Number of major faults the system has made per second, those which have required loading a memory page from disk.

pgfree/s
       Number of pages placed on the free list by the system per second.

pgscank/s
       Number of pages scanned by the kswapd daemon per second.

pgscand/s
       Number of pages scanned directly per second.

pgsteal/s
       Number of pages the system has reclaimed from cache (pagecache and swapcache) per second to satisfy its memory demands.

%vmeff
              Calculated as pgsteal / pgscan, this is a metric of the efficiency of page reclaim. If it is near 100% then almost every page coming off the tail of the inactive list is being reaped. If it gets too  low  (e.g.
              less than 30%) then the virtual memory is having some difficulty.  This field is displayed as zero if no pages have been scanned during the interval of time.

一些CASE

如果PostgreSQL 设置了非常大的shared buffer, 为什么会有一段性能低潮(指全力压测时,平时估计感觉不到)
在PostgreSQL shared buffer设得非常大的情况下,Shared buffer作为进程的虚拟地址空间中的一部分,刚启动时这些虚拟地址空间还没有在物理内存中,所以填充过程中会发生page fault,性能较低。
当shared buffer被快速填满后,page fault减少,性能会上来。
例如在压测持续高并发的COPY数据入库时,看这个case https://yq.aliyun.com/articles/8528
在前面几百GB,page fault较多,产生较多的中断(这个case是软的,因为是在shared buffer中进行extend block,么有落盘),性能比shared buffer填满后有一定的差异。
240GB shared buffer,
shared buffer 填满前,2.8GB/s 导入速度

12:13:46 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
12:13:47 AM      8.08 1699410.10  40058.59      0.00 142064.65 137696.97      0.00 137632.32     99.95
12:13:48 AM     15.84 1634396.04  38605.94      0.00 412391.09 411564.36      0.00 411627.72    100.02

 22  44  33   0   0   0|  32k 2763M| 239B  364B|   0     0 | 184k  335k
 22  44  34   0   0   0|  12k 2791M| 120B  544B|   0     0 | 184k  336k
 22  45  33   0   0   0|  12k 2768M| 471B 1198B|   0     0 | 185k  341k
 22  44  33   0   0   0|  16k 2764M| 210B  454B|   0     0 | 183k  336k
 22  44  34   0   0   0|  16k 2777M| 239B  364B|   0     0 | 185k  341k

shared buffer 填满后, 4.7GB/s导入速度

12:14:40 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
12:14:41 AM     16.33 2831730.61    823.47      0.00 735045.92 725126.53      0.00 724985.71     99.98
12:14:42 AM     12.00 2760160.00    743.00      0.00 738037.00 728352.00      0.00 728370.00    100.00
12:14:43 AM     11.88 2751279.21    326.73      0.00 720171.29 715310.89      0.00 715374.26    100.01
12:14:44 AM     20.00 2788468.00    338.00      0.00 727221.00 720480.00      0.00 720480.00    100.00
12:14:45 AM     12.50 2858970.83    425.00      0.00 753507.29 740266.67      0.00 740166.67     99.99

 24  18  56   0   0   1|  28k 4703M| 120B  364B|   0     0 | 366k  655k
 24  18  57   0   0   1|  16k 5031M| 892B  994B|   0     0 | 382k  690k
 24  19  56   0   0   0|  12k 4833M| 120B  364B|   0     0 | 374k  672k
 24  19  56   0   0   1|8192B 4737M| 239B  544B|   0     0 | 371k  668k
 24  19  56   0   0   1|  20k 4826M| 120B  454B|   0     0 | 375k  674k

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://nwjs.net/news/300093.html

如若内容造成侵权/违法违规/事实不符,请联系七分地网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 自动重启进程

Js代码 #!/bin/sh echo "Current DIR is " $PWD # ignore signal hup int quit tstp trap "" 1 2 3 24 start_server() { ulimit -c unlimited # export LD_LIBRARY_PATHpwd/deps/capn/libs:$LD_LIBRARY_PATH # rm -f *.pid # nohu…

Lucene学习笔记:Field.Store.* 域存储选项

2019独角兽企业重金招聘Python工程师标准>>> Store.YES: 指定存储域值。该情况下,原始的字符串值全部都被保存在索引中,并可以由IndexReader类恢复。该选项对于需要展示搜索结果的一些域很有用(如URL、标题或数据库主键)。如果索引…

第四次作业 孙保平034 李路平029

用C编写一个学生成绩管理系统 1、可以实现以下功能&#xff1a; cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 1.增加学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl; 2、用链表存储信息 * 程序头部的注释结束 3、约定的规范&#xff1a; 1界面设计简介&#xff0c;人性化…

linux sar命令 性能监控

目录 1. CPU资源监控 2. inode、文件和其他内核表监控 3. 内存和交换空间监控 4. 内存分页监控 5. I/O和传送速率监控 6. 进程队列长度和平均负载状态监控 7. 系统交换活动信息监控 8.统计网络信息 9. 设备使用情况监控 10.常用命令汇总 sar命令常用格式 sar [optio…

android绘制高亮区域,实现高亮某行的RecyclerView效果

最终效果全部代码&#xff1a;github方式有二组合控件&#xff0c;RecyclerView View自定义RecyclerView1中只需要控制View&#xff0c;但是不好封装。2中需要重写RecyclerView中一些东西&#xff0c;最终就是一个CustomRecyclerView。所以采用的是第二种方法。代码100来行。主…

Android App监听软键盘按键的三种方式

前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候&#xff0c;例如&#xff1a;我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面&#xff1b;在点击搜索框的时候&#xff0c;点击右下角的search符号键可以进行搜索&#xff1b;或者在全…

常用元素位置与大小总结

偏移量 offsetHeight: 元素在垂直方向占据的空间大小 > 内容高度 上下padding 上下boderoffsetWidth: 元素在水平方向占据的空间大小 > 内容宽度 左右padding 左右boderoffsetTop: 元素外边框距离offsetParent的上内边框的距离offsetLeft: 元素外边框距离offsetParen…

android将被代替的控件,Android 控件被忽略的属性

作者&#xff1a;ivm参考了 http://www.cnblogs.com/jisheng/archive/2013/01/10/2854088.html导航栏&#xff1a;1.TextView autoLinkHtml.fromHtml()2.Typeface &#xff1a;设置字体3.Switch 及 togglebutton4.AnalogClock DigitalClock 两个时钟的控件5.5.秒表控件Chronic…

AngularJS 、Backbone.js 和 Ember.js 的比较

2019独角兽企业重金招聘Python工程师标准>>> 译文: http://www.oschina.net/translate/javascript-framework-comparison 原文: http://www.airpair.com/js/javascript-framework-comparison 转载于:https://my.oschina.net/ilivebox/blog/307816

linux “大脏牛”漏洞分析(CVE-2017-1000405)

一、背景简介 脏牛漏洞(CVE-2016–5195)是公开后影响范围最广和最深的漏洞之一&#xff0c;这十年来的每一个Linux版本&#xff0c;包括Android、桌面版和服务器版都受到其影响。恶意攻击者通过该漏洞可以轻易地绕过常用的漏洞防御方法&#xff0c;对几百万的用户进行攻击。尽…

安卓音乐播放器开发实例

本文将引导大家做一个音乐播放器&#xff0c;在做这个Android开发实例的过程中&#xff0c;能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件。为了有更好的学习效果&#xff0c;其中很多功能我们手动实现&#xff0c;例如音乐播放的快进快退等。 先欣赏下本实例完成…

云计算&大数据 “下一幕”智能变革之力

2019独角兽企业重金招聘Python工程师标准>>> 2016年的互联网科技领域&#xff0c;云计算、大数据、人工智能成为最热词汇。阿里云“为了无法估算的价值”将中国的计算触角伸向海外&#xff0c;百度首次向外界展示“百度大脑”的科技成果&#xff0c;移动互联网利用人…

html和css有序列表,HTMLCSS基础学习笔记14—有序列表及列表嵌套

我们上篇讲到了无序列表&#xff0c;那么今天就来看看有序列表和他们的组合嵌套使用吧。有序列表现在我们要做那堆杂事了&#xff0c;但是发现这么多杂事&#xff0c;先做哪个好呢&#xff1f;于是我们给这堆杂事弄个优先级排序&#xff0c;让我们能够按照顺序做下去。HTML里用…

华硕笔记本BIOS设置详解

BIOS是英文Basic Input/Output System的缩写&#xff0c;即基本输入输出系统&#xff0c;合理的BIOS设置可以让我们的电脑更好的为我们服务&#xff0c;但由于大部分笔记本的BIOS界面是英文&#xff0c;并且BIOS里面的某些关键选项稍有差池就会导致各种各样的问题&#xff0c;导…

发表论文不用愁,十大技巧治秃头

鱼羊 编译整理 量子位 报道 | 公众号 QbitAI做研究跟发文章&#xff0c;完全是两码事。实验一时爽&#xff0c;落笔火葬场。好不容易憋出了初稿&#xff0c;又有多少研究僧跪在了反复修改的漫漫长路上。对于很多科研党来说&#xff0c;比起嗑盐的过程&#xff0c;恐怕写文章更让…

Ext4 MVC CRUD操作

项目目录结构如下&#xff1a; &#xff08;1&#xff09;index.html <!DOCTYPE html> <html><head><title>用户管理</title><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial…

手机拍视频,实时换背景,继马卡龙玩图后,Versa又出了一款更厉害的App

郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI在前不久荣耀9X的发布会上&#xff0c;一个名叫绿幕侠的App亮相了。现场的展示中&#xff0c;这个App能让手机拍摄的视频&#xff0c;产生电影绿幕一般的效果&#xff0c;实时从视频中去掉背景&#xff0c;只保留主角人物&#…

html中多边形图形怎么制作,CSS制作图形速查表

前面在《纯CSS制作的图形效果》一文中介绍了十六种CSS画各种不同图形的方法。今天花了点时间将这方面的制作成一份清单&#xff0c;方便大家急用时有地方可查。别的不多说了&#xff0c;直接看代码。为了节省时间&#xff0c;下面图形都采用的一个标签&#xff0c;可以是块元素…

unity学习

2019独角兽企业重金招聘Python工程师标准>>> 1.发布ios应用的时候会生成一个xcode工程。已经发布过ios&#xff0c;再次发布的时候可以选择replace 或者是append原xcode工程。如果ios工程是不同unity版本创建的&#xff0c;那么不能append。但是如果我们修改过ios的…

腾讯AI击败王者荣耀职业队,全靠自学、策略清奇,一天训练量为人类440年

问耕 发自 麦蒿寺量子位 出品 | 公众号 QbitAI王者峡谷&#xff0c;风云突变。一场激烈的对战正在进行&#xff0c;左侧是五位人类职业电竞高手组成的赛区联队&#xff0c;另一方是……嗯&#xff1f;他们的对手没有出场&#xff1f;五个座椅空空荡荡&#xff1f;不。他们的对手…