注意到zram有几个月时间了,据资料显示,最早使用内存压缩作为swap的,应该是苹果,从10.9开始支持,而Linux,有几种内存压缩的方法,分别是:
zram,CentOS 6支持,但默认没有开启,Android方面,华为P8也支持并默认启用
zswap
zcache
网上鲜有性能测试的文章,这也是本人一块心病,上周日抽空测试了下,本文测试的是zram
测试目的
对比磁盘swap设备和内存swap设备的性能差异
学习cgroup的使用
学习ArchLinux
学习systemd
使用CubieTruck进行装逼
测试难点
如何让程序产生swap操作
测试环境
硬件
CubieTruck(多谢老婆的圣诞礼物)
A20,双核
2G内存
64G的tf卡
系统环境
ArchLinuxARM-armv7-latest
内核版本:4.3.0-2-ARCH
系统装在一张64G的tf卡上,用以下代码测试得到读写速度如下,比较差,会影响磁盘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
测试方法
mbw,这个不详细说了,可以参考Linux内存带宽的一些测试笔记,如果系统是2G内存,则复制1G的数据,会导致程序使用swap
cgroup限制内存大小 + 网络搜索的一个程序,本文使用这个进行测试,在分配内存超过cgroup限制时,系统会把数据交换到swap
内存分配代码
代码来自:cgroup–内存 限制内存测试,做了一点点修改,加入了开始和结束时间,请原谅我不懂C
源码
#include
#include
#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设置
安装服务运行方式软件
如果单纯用这个,需要修改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
命令行设置cgroup
# 新增一个mysql的内存组
sudo cgcreate -g memory:mysql
# 切换到root,设置内存限制大小为50M
sudo su -
echo 50M > memory.limit_in_bytes
设置磁盘swap
sudo fallocate -l 512M /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
设置zram
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
测试的时候,可以用top或者htop观察swap的使用情况
可以看到swap是每50M,50M地增加
磁盘swap的数据
共耗时80s
# 开始
Sun Dec 13 17:06:16 CST 2015
# 结束
Sun Dec 13 17:07:36 CST 2015
zram的数据
共耗时8s
# 开始
Sun Dec 13 17:12:28 CST 2015
# 结束
Sun Dec 13 17:12:36 CST 2015
结论
性能提升了90%
本测试存在问题
未测试zram下MySQL的性能,MySQL测试感觉更接地气
TF卡比较影响性能,要在服务器上测试
只测了一次数据,没有多次测试进行取平均值
未监控CPU的变化
参考资料