实例

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. redo allocation latch redo copy latch

    这两个latch 是干什么的一直有点迷糊,刚才上网查了一下,总结如下: redo allocation latch 在Log Buffer中分配内存空间时需要获取Redo allocation lat ...

  2. Exchange 2013 的会议室邮箱用户一直无法正常登陆。

    某客户使用了Exchange 2013 server作为邮件承载server.详细版本号为Exchange 2013 SP1. 如今客户有个需求,希望他们的邮箱作为会议室邮箱创建,并且必须有普通邮箱全 ...

  3. Oracle学习(12):存储过程,函数和触发器

    存储过程和存储函数 l存储在数据库中供全部用户程序调用的子程序叫存储过程.存储函数. 注意:存储过程与存储函数声明变量时,用的是as   而不是declare 存储过程与存储函数差别 存储过程不带有返 ...

  4. 【c语言】字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成“%20”

    // 字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成"%20". // 比如输入"we are happy.",则输出"we%20are ...

  5. oc29--property修饰符

    // // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject /* 如果给一个属性同时提供了g ...

  6. setprecision、fixed、showpoint的用法总结(经典!!超经典!!)【转】

    本文转载自:http://blog.csdn.net/u011321546/article/details/9293547 首先要加头文件:iomanip 一:setprecision 作用:控制输出 ...

  7. Linux framebuffer显示bmp图片【转】

    本文转载自:http://blog.csdn.net/luxiaoxun/article/details/7622988 framebuffer简介 帧缓冲(framebuffer)是Linux为显示 ...

  8. C# 操作 INI 自己工作笔记(对文本框的操作)

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  9. cocos2d-x https

    cocos2d-x :2.1.3HttpClient.cpp文件中  bool configureCURL(CURL *handle)后边添加如下两句: curl_easy_setopt(handle ...

  10. webapi时间字段返回格式设置及返回model首字母小写

    GlobalConfiguration.Configuration.Formatters.Remove(new XmlMediaTypeFormatter()); // 解决json序列化时的循环引用 ...