实例

git server是一个io密集型的服务,当cache量很大的时候,cache会全部一次释放,导致那么一瞬间,IO read压力很大,因为,用户的大量请求,需要重新从磁盘读到内存,但是这个时刻,CPU的使用率也只有28%,可见,CPU的使用率虽然低,但是IO已经到达瓶颈,如果,kernel管理内存方式中有没有一种机制,可以控制cache释放多少?比如他们现在一下子cache释放150G,有什么参数可以修改一下,cache一次只回收50G,我想可以很大程度上改善这个问题,如果没有这个机制,也许只有扩容了。。。。

min

从上文中,可以看出min的值,决定了low的值,和high的值;其计算关系就是:

 watermark[min] = min_free_kbytes换算为page单位即可,假设为min_free_pages。(因为是每个zone各有一套watermark参数,实际计算效果是根据各个zone大小所占内存总大小的比例,而算出来的per zone min_free_pages)
watermark[low] = watermark[min] * 5 / 4
watermark[high] = watermark[min] * 3 / 2

修改min_free_kbytes的值在这里:

[root@muahao_host /home/ahao.mah]
#cat /proc/sys/vm/min_free_kbytes
3145728
/proc/zoneinfo 文件中的单位是page,page的大小是4KB

[root@muahao_host /home/ahao.mah]
#cat /proc/zoneinfo | grep min
min 63
min 7139
min 779229
[root@muahao_host /home/ahao.mah]
#echo "3145728/4" |bc
786432
[root@muahao_host /home/ahao.mah]
#echo "63+7139+779229" |bc
786431
如上,计算出来,/proc/sys/vm/min_free_kbytes 的值和zoneinfo中的值是基本一致的!!

如下,计算min的值,居然只有2GB这让我很疑惑!!!

[root@muahao_host /home/ahao.mah]
#echo "(63+7139+779229)*4/1024/1024" |bc
2

low

[root@muahao_host /home/ahao.mah]
#cat /proc/zoneinfo | grep low
low 78
low 8923
low 974036
[root@muahao_host /home/ahao.mah]
#echo "78+8923+974036" |bc
983037
[root@muahao_host /home/ahao.mah]
#echo "(78+8923+974036)*4/1024/1024" |bc
3

high

[root@muahao_host /home/ahao.mah]
#cat /proc/zoneinfo | grep high
high 94
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high: 0
high 10708
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high 1168843
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
high: 186
[root@muahao_host /home/ahao.mah]
#cat /proc/zoneinfo | grep high | grep -v :
high 94
high 10708
high 1168843
[root@muahao_host /home/ahao.mah]
#echo "(1168843+10708+94)*4/1024/1024" |bc
4

下图是我一直很疑惑的地方!为什么会在free只剩下5G的时候开始回收? 按道理应该到low值的时候开始使用kswapd回收呀,那么这里的low值应该是3G呀?看tsar的图,应该还没有到low值就回收了,唯一可能的原因也许是,不是kswapd回收的,而是,用户请求的内存过大,直接触发了direct claim可能,但是,果direct claim的话,是不是就不关系 high water mark了?也许只有这样才能解释的通!!!

Q1: 这个里的回收是swapd呢?还是direct claim呢?

A: 这里我看像是direct claim,因为,还没有大low值,回收就开始了;

Q2: 如果是direct claim,kernel这个机制会回收那么多?还遵循水位吗?直接从140G到12G是不是有点不科学?

A: 经过和同事的讨论,他认为direct claim回收,其实也不是一次全部回收,只要满足kernel的内存请求,也就会适可而止了,那么该如何解释我这里的140G到12G这么大力度的回收呢?原因也许只有一个,内存碎片化太严重!!而你请求的又是很大的连续的地址,第一次释放了一些cache,发现没有,即使释放50G cache可能都不行,关键是,释放的内存地址都不连续啊,有个毛用!! 如果你请求order是3,那么就是8个连续的page,一个page 是4KB,那么这么长的连续的地址,在内存中是很少的,你可以通过看/proc/buddyinfo来看,内存的碎片程度!!

看buddyinfo的时候,我们就看 Normal,碎片很严重的时候,可能就后面几个数字都是0;

#cat /proc/buddyinfo
Node 0, zone DMA 1 1 0 0 2 1 1 0 1 1 3
Node 0, zone DMA32 190 202 132 186 539 712 463 230 77 51 65
Node 0, zone Normal 13000 21608 30616 8586 8695 8090 2093 2123 410 119 1

回头再看看我的问题,我从140G掉到5G,是在5分钟内完成,/03/17-02:15 到10/03/17-10:55 经历了大概8个小时,cache从5G涨到140G,140G继续持续跑了几天后,不知道在什么时候,某一个瞬间,从140G瞬间跌倒5G,这个现象更像是,内存碎片很严重,到某个时间点,来了一些连续内存请求,导致,cache大量回收!!!想找到根本原因,可以部署扁鹊,或者用sysdig去查看到底执行了什么函数,在那个时间点



Git server出现cache大回收分析的更多相关文章

  1. windows系统与SQL SERVER 2008数据库服务性能监控分析简要

    软件系统性能测试体系流程介绍之windows系统与SQL SERVER 2008数据库服务性能监控分析简要 目前大部分测试人员对操作系统资源.中间件.数据库等性能监控分析都是各自分析各自的监控指标方式 ...

  2. Bonobo Git Server (Simple git server for Windows.) 测试备忘

    Bonobo Git Server是一款Windows上的Git Server,它使用IIS即可,走的是Http协议,只要简单的安装就能使用,但是因为我的项目大小有1.35GB在 push 的时候一直 ...

  3. # 基于Gitolite搭建Git Server - 支持SSH&HTTP

    Git, 一个分布式的版本管理工具,我认为其革命性的点:在于改变了用户协作的方式,使得协作更简单. 下面讲述 使用一个开源软件 Gitolite搭建一个Git Sever, 并给了一个推荐的团队协助方 ...

  4. Windows下部署Git Server端

    解决方案一: (注意:如果英文阅读没太大障碍,直接到Bonobo官网看相关文档即可.) win7(windows server 2008应该也可以,没测试过)+ IIS7.5(win7自带的)+ Gi ...

  5. Gitolite轻松部署/管理git server

    对于今天越来越受欢迎的Git,相信做开发的朋友都基本有所耳闻.它最大的便利就是分布式的开发库,让使用git作为源码管理库的开发者可以在本地提交代码的修改而不用提交到远程的库,同时需要和团队协作.同步代 ...

  6. 逐步在Windows上结合CopSSH + msysGit安装安装Git Server同时集成Git使用Visual Studio

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  7. Ubuntu 搭建简单的git server

    Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议. 在此,我们将会讨论那些协议及哪些情形应该使用(或避免使用)他 ...

  8. 在 Ubuntu 系统中部署 Git Server

    http://blog.csdn.NET/poisonchry/article/details/11849781 虽然有很多开源的Git仓库,不过并非所有都尽人意,譬如Github,Gitlab等,不 ...

  9. git server 搭建指南

    搭建git服务器的经验总结 一: Server端的设置 1. 安装 git, git-core 2. 安装 ssh-server. (代码上传通道) 3. 创建git 用户 指定其目录 和所在组 4. ...

随机推荐

  1. LINUX 内核 图 外国牛人

    http://duartes.org/gustavo/blog/ http://blog.csdn.net/drshenlei

  2. gap lock/next-key lock浅析Basic-Paxos协议日志同步应用

    http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...

  3. 大数据处理之道(实验方法<二>)

    一:交叉验证(crossvalidation)(附实验的三种方法)方法简单介绍   (1) 定义:交叉验证(Cross-validation)主要用于建模应用中,比如PCR(Principal Com ...

  4. 为Chrome开发插件提高工作效率

    工作生活,什么最珍贵,我觉得是时间,怎么节约时间是一个最重要的问题,如果你有重复的工作在网页上,请接着看 上手步骤: 打开https://developer.chrome.com/extensions ...

  5. 基于Spark ML的Titanic Challenge (Top 6%)

    下面代码按照之前参加Kaggle的python代码改写,只完成了模型的训练过程,还需要对test集的数据进行转换和对test集进行预测. scala 2.11.12 spark 2.2.2 packa ...

  6. 如何修改vos2009/vos3000的web端口?

    vos 2009. VOS 3000 2120 -2138版本在这里 /usr/apache-tomcat-5.5.15/conf 编辑 server.xml 找到 <!-- Define a ...

  7. PCB LDI 实现周期自动更新 实现思路

    一.基本思路整理如下: 二.封周期启动程序C#代码(部份代码) /// <summary> /// 单个生产型号 更新周期 /// </summary> /// <par ...

  8. Fishnet(几何)

    http://poj.org/problem?id=1408 题意:给出 a1 a2 ... an                b1 b2 ... bn                c1 c2 . ...

  9. springboot启动报错:Cannot determine embedded database driver class for database type NONE.

    package cn.zb.test; import org.springframework.boot.SpringApplication; import org.springframework.bo ...

  10. Js:弹窗剧中

    js变量设置 var iWidth = $(window).width() * 0.9; var iHeight = $(window).height() * 0.9; - iHeight) / ; ...