寻觅生命中的那一片浅草......

在cgroup下进行zram性能测试

注意到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 <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设置

安装服务运行方式软件

如果单纯用这个,需要修改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的变化

参考资料

2024年三月
« 5月    
 123
45678910
11121314151617
18192021222324
25262728293031