鲁网 - 山东省重点新闻网站,山东第一财经门户

广州 「切換城市」 培訓家旗下培訓平臺
手機版
網站導航

記一次內存占用問題的調查過程

2020.02.21

發布者:廣州小碼王教育

  最近在維護一臺CentOS服務器的時候,發現內存無端"損失"了許多,free和ps統計的結果相差十幾個G,搞的我一度又以為遇到靈異事件了,后來Google了許久才搞明白,特此記錄一下,以供日后查詢。
  雖然天天都在用Linux系統辦公,其實對它的了解也不過爾爾。畢業幾年才邁入"知道自己不知道"的境界,我覺得自己絲毫沒有愧對萬年吊車尾這個稱號 :(
  同事說有一臺服務器的內存用光了,我連上去用free看了下,確實有點怪。

$ free -g
             total       used       free     shared    buffers     cached
Mem:            15         15          0          0          2          0
/+ buffers/cache:         12          2
Swap:           17          0         17

  這臺服務器有16G內存,但是結果顯示除了2G左右的文件Buffer緩存外,其余十幾G都被確確實實的用光了。(free按1024進制計算,總內存可能比實際偏小)
  這里大概介紹下free結果的含義:

/totalusedfreesharedbufferscached
Mem總物理內存當前使用的內存(包括slab+buffers+cached)完全沒有使用的內存進程間共享的內存緩存文件的元數據1緩存文件的具體內容1
/+ buffers/cache當前使用的內存(不包括buffers+cached,但包括slab)未使用和緩存的內存(free+buffers+cached)
Swap總的交換空間已使用的交換空間未使用的交換空間

  然后top看了下,沒有特別吃內存的程序。用ps大概統計下所有程序占用的總內存:

$ ps aux | awk '{mem += $6} END {print mem/1024/1024}'
0.595089

  結果顯示所有進程占用的內存還不到1G,實際上,因為free, ps的統計方式的差別和Copy-on-write和Shared libraries等內存優化機制的存在,這兩者的統計結果通常是不一樣的。但是一般情況下**不會相差十幾個G,肯定是有什么隱藏的問題,Google了許久后發現,free沒有專門統計另一項緩存: Slab。
  Slab Allocation是Linux 2.2之后引入的一個內存管理機制,專門用于緩存內核的數據對象,可以理解為一個內核專用的對象池,可以提高系統性能并減少內存碎片。(Linux 2.6.23之后,SLUB成為了默認的allocator。)
  查看Slab緩存

$ cat /proc/meminfo

其中,Slab相關的數據為

Slab:             154212 kB
SReclaimable:      87980 kB
SUnreclaim:        66232 kB

SReclaimable(Linux 2.6.19+)都是clean的緩存,隨時可以釋放。回到之前的內存問題,我查了下那臺服務器上Slab占用的內存:

$ cat /proc/meminfo | grep Slab
Slab:         12777668 kB

  12G的Slab緩存,有意思的是free把Slab緩存統計到了used memory中,這就是之前那個問題的癥結所在了。
  另外,還可以查看/proc/slabinfo(或使用slabtop命令)來查看Slab緩存的具體使用情況。結果發現,ext3_inode_cache和dentry_cache占用了絕大部分內存。
  考慮到這臺服務器會頻繁地用rsync同步大量的文件,這個結果也并不意外。
  先說明一下,如果問題僅僅是Slab占用了太多的內存(SReclaimable),那么通常不需要太操心,因為這根本不是個問題(如果是 SUnreclaim太多且不斷增長,那么很有可能是內核有bug)。但是,如果是因為Slab占用內存太多而引起了其他的問題,建議繼續閱讀。
  清除Slab可回收緩存
  通過/proc/sys/vm/drop_caches這個配置項,我們可以手動清除指定的可回收緩存(SReclaimable)2。

echo 2 > /proc/sys/vm/drop_caches

  上面的命令會主動釋放Slab中clean的緩存(包括inode和dentry的緩存),然后再free -g一下,未使用的內存陡增了十幾個G。。。
  需要注意的是,手動清除緩存可能會在一段時間內降低系統性能。原則上不推薦這么做,因為如果有需要,系統會自動釋放出內存供其他程序使用。
  另外,手動清除Slab緩存是一個治標不治本的辦法。因為問題不在Slab,而在于我們那個會引起Slab緩存飆漲的進程(我這里應該是 rsync)。實際操作的時候發現,清除緩存一段時間后,Slab緩存很快又會“反彈”回去。如果需要治本,要么搞定問題進程,要么修改系統配置。
  調整系統vm配置
  風險預警: 調整以下系統配置可能會對系統性能造成負面影響,請仔細測試并謹慎操作。
  /etc/sysctl.conf里有幾個對內存管理影響比較大的配置,以下配置項的文檔見vm.txt。
  vm.vfs_cache_pressure
  系統在進行內存回收時,會先回收page cache, inode cache, dentry cache和swap cache。vfs_cache_pressure越大,每次回收時,inode cache和dentry cache所占比例越大3。
  vfs_cache_pressure默認是100,值越大inode cache和dentry cache的回收速度會越快,越小則回收越慢,為0的時候完全不回收(OOM!)。


  圖片取自The Linux Kernel's VFS Layer
  vm.min_free_kbytes
  系統的"保留內存"的大小,"保留內存"用于低內存狀態下的"atomic memory allocation requests"(eg. kmalloc + GFP_ATOMIC),該參數也被用于計算開始內存回收的閥值,默認在開機的時候根據當前的內存計算所得,越大則表示系統會越早開始內存回收。
  min_free_kbytes過大可能會導致OOM,太小可能會導致系統出現死鎖等問題。
  vm.swappiness
  該配置用于控制系統將內存swap out到交換空間的積極性,取值范圍是[0, 100]。swappiness越大,系統的交換積極性越高,默認是60,如果為0則不會進行交換。
  man proc
  The Linux Kernel's VFS Layer
  The VFS in Linux Kernel V2.4
  openSUSE: System Analysis and Tuning Guide, Chapter 15. Tuning the Memory Management Subsystem
  Red Hat Enterprise Linux, 5.5 Tuning Virtual Memory
  Odd behavior
  Wikipedia:Slab allocation
  Linux System IO Monitoring
  Paging
  Understanding the Linux Virtual Memory Manager
  Understanding the Linux Kernel, 3rd Edition
  1 2
  Red Hat Enterprise Linux,5.1 Checking the Memory Usage,引用于2014-12-12。
  Linux kernel documentation, sysctl#vm,引用于2014-12-12。
  @TODO: 需要查看相關內核代碼來確認,不過看vm.txt里的描述應該是這個意思。

上一篇:早教那點小事 下一篇:開源分布式存儲之我見

推薦機構

熱門課程

廣州小碼王教育推薦

在這里,廣州市小碼王少兒編程為您提供5個優質課程,覆蓋少兒科技培訓、少兒編程培訓、青少年編程培訓等方面的課程信息,在這里您可以查詢到課程報價,學校位置,電話、開課時間等選課信息,網上預訂廣州市小碼王少兒編程免費試聽課程,還可以體驗不可思議低價驚喜。

本站展示的所有信息內容系由機構或個人用戶發布,可能存在發布者所發布的信息,并未獲得品牌所有人有效授權。本平臺會加強審核,但無法完全排除差錯或疏漏。鄭重聲明:本平臺僅為免費注冊用戶提供免費的信息發布渠道,但不對其發布信息的真實性、準確性和合法性負責,對此也不承擔任何法律責任。對于從本網站或本網站的任何有關服務所獲得的資訊、內容或廣告,您接受或信賴任何信息所產生之風險應自行承擔,本網對任何使用或提供本網站信息的商業活動及其風險不承擔任何責任。,如果侵犯,請及時通知我們,發送郵件至15610150293@126.com本網站將在第一時間及時刪除。

主站蜘蛛池模板: 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 灌木树苗-绿化苗木-常绿乔木-价格/批发/基地 - 四川成都途美园林 | 光照全温振荡器(智能型)-恒隆仪器| 河南mpp电力管_mpp电力管生产厂家_mpp电力电缆保护管价格 - 河南晨翀实业 | 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 吹塑加工_大型吹塑加工_滚塑代加工-莱力奇吹塑加工有限公司 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) | 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 酒万铺-酒水招商-酒水代理 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 首页|成都尚玖保洁_家政保洁_开荒保洁_成都保洁 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 耐腐蚀泵,耐腐蚀真空泵,玻璃钢真空泵-淄博华舜耐腐蚀真空泵有限公司 | 全自动真空上料机_粉末真空上料机_气动真空上料机-南京奥威环保科技设备有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 屏蔽服(500kv-超高压-特高压-电磁)-徐吉电气 | 湖南自考_湖南自学考试网 | 东风体检车厂家_公共卫生体检车_医院体检车_移动体检车-锦沅科贸 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 磁棒电感生产厂家-电感器厂家-电感定制-贴片功率电感供应商-棒形电感生产厂家-苏州谷景电子有限公司 | 月嫂_保姆_育婴_催乳_母婴护理_产后康复_养老护理-吉祥到家家政 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 福建成考网-福建成人高考网|