KernelDedup

Feed Rss

0.1.2

对于大部分用户来说,UKSM的使用意味着安装内核,然后重启。其缺省设置基本上能符合大部分台式机用户的需求。你可以下载一个简单的测试程序来测试效果。

在安装了UKSM内核的系统中,uksmd是主要的工作进程。其基本的工作模式是:扫描合并一定数量的内存页面,休眠一段时间,然后继续。

大部分情况下,你所需要修改的是cpu_governormax_cpu_percentage 这两个接口。

UKSM的相关控制参数和统计信息在以下目录中:

该目录中主要的控制接口含义如下:

用户可以修改的基本控制接口:

  • run  控制工作进程uksmd是否开启。缺省是开启的,如果你想关闭可以:echo 0 > run
  • sleep_millisecs  每次休眠多长时间再开始工作,以毫秒(千分之一秒)计算。
  • cpu_governor 这 个是一个宏观的UKSM速度模式的接口,通过 cat cpu_governor可以看到几种可选的模式和当前激活的模式,比如 [full] medium low quiet,这个说明当前采用的是全速扫描。这个几个扫描级别基本对应了 90%以上,50%,20% 和  < 1%的最大CPU占用控制以及对应的一些其它高级参数的微调
  • max_cpu_percentage 在已经使用了某个具体的cpu使用模式下,你可以进一步精确限制最大的cpu占用百分比。例:(最大为35%的最高CPU占用):echo 35 > max_cpu_percentage

用户只读的UKSM相关的信息:

  • full_scans  采样覆盖全部内存区域的次数。
  • hash_strength  自适应增量采样算法的当前的强度,值越低,那么当前合并的速度将会越快。
  • pages_scanned 当前已经扫描了多少页面。
  • pages_shared 有多少个不同的物理页面处在被共享的状态
  • pages_sharing 有多少个虚拟页面指向以上的共享页面,差不多可以等效看作你节省的内存。
  • sleep_times  uksmd已经休眠了多少次

我们特殊考虑全0的页面,用户可以通过

来查看,当前已经有多少全0的页面被合并(节省出来)。

 

高级控制接口:

为了理解高级控制接口的含义,简单介绍一下uksmd的工作模式:uksmd对所有内存区域的扫描分4个级别,前两个级别一般是用作探测发现有高冗余度的 内存区域,因此一般应该有比较低的扫描速度,而后两个级别是真正大量消除冗余的级别,因此一般应该有比较高的扫描速度。uksmd对内存的冗余度评估采用 全内存采样的方式,整个内存采样一遍,叫做一个采样周期,每个级别可以定义采样周期的长短,周期越短,uksmd反应越敏锐,周期越长,采样评估的置信度 越高。目前我自己的使用经验来看,0.5~1秒以内的采样周期比较合适。

  • cpu_ratios: 每个扫描级别的CPU占用率,以万分之一作为单位,或者以最高CPU占用作为参考。

                    例(cat cpu_ratios): 50 75 MAX/4 MAX/1

这 个说明我当前的四个扫描级别的速度分别是   0.5%, 0.75%,最大扫描速度(max_cpu_percentage)的 1/4和 最大扫描速度,大部分时间在没有大量冗余内存的时候,uksmd对CPU的占用在 0.5%左右,top就看不出来了,我自己已经很满意了。

  • eval_intervals:四个扫描级别的采样周期大小,以毫秒为单位。如果是0的话,表明,不对其采样,扫描完毕为止。这一般用在最高的扫描级别,即我们已经非常确信这里面有很多冗余页面。
  • abundant_threshold:   一个区域有多少百分数的有效冗余页面,uksmd才会拔高它的扫描级别,缺省是10, 即只有当一个区域被发现超过10%的页面是冗余的时候,我们才会加速它的扫描。