注意到zram有几个月时间了,据资料显示,最早使用内存压缩作为swap的,应该是苹果,从10.9开始支持,而Linux,有几种内存压缩的方法,分别是:
网上鲜有性能测试的文章,这也是本人一块心病,上周日抽空测试了下,本文测试的是zram
如何让程序产生swap操作
sudo dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 87.9956 s, 12.2 MB/s
代码来自:cgroup–内存 限制内存测试,做了一点点修改,加入了开始和结束时间,请原谅我不懂C
#include <stdio.h>
#include <stdlib.h>
#define MEGABYTE (1024*1024)
int main(int argc, char *argv[])
{
system("date");
void *myblock = NULL;
int count = 0;
int i,n=300; /// 分配300M
while (n--)
{
myblock = (void *) malloc(MEGABYTE);
if (!myblock)
break;
for(i = 0;i < MEGABYTE / 4;i ++) /// 由于操作系统的某些机制,申请的内存只有在用到的时候才
{ /// 真正申请内存,所以这里需要写内存操作。
((unsigned int*)myblock)[i] = i;
}
count++;
printf("%d \n",count);
}
system("date");
exit(0);
}
gcc malloc_zram.c -o malloc_zram
如果单纯用这个,需要修改cgroup.config,比较麻烦一点
sudo pacman -Sy cgmanager
安装libcgroup,提供了cgcreate、cgexec等命令,针对单次执行,测试会比较方便
sudo pacman -Sy --noconfirm byacc flex
cd /dist/dist
wget http://downloads.sourceforge.net/libcg/libcgroup-0.41.tar.bz2
cd ../src
tar xf ../dist/libcgroup-0.41.tar.bz2
cd libcgroup-0.41
./configure
make
sudo make install
# 新增一个mysql的内存组
sudo cgcreate -g memory:mysql
# 切换到root,设置内存限制大小为50M
sudo su -
echo 50M > memory.limit_in_bytes
sudo fallocate -l 512M /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo su -
modprobe zram
echo lz4 > /sys/block/zram0/comp_algorithm
echo 500M > /sys/block/zram0/disksize
mkswap --label zram0 /dev/zram0
swapon --priority 100 /dev/zram0
先测试磁盘swap,然后关闭磁盘swap,启用zram,再测试zram,忙活了一天,本来是要测试MySQL的,后来发现设置后,MySQL的内存并没有受限制,所以转战简单的内存测试程序,时间限制,只测试了一次
# 从源码看出,是分配300M内存
# 使用memory:mysql这个内存组
cgexec -g memory:mysql /dist/src/malloc_mem
共耗时80s
# 开始
Sun Dec 13 17:06:16 CST 2015
# 结束
Sun Dec 13 17:07:36 CST 2015
共耗时8s
# 开始
Sun Dec 13 17:12:28 CST 2015
# 结束
Sun Dec 13 17:12:36 CST 2015
性能提升了90%