IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    在cgroup下进行zram性能测试

    夜行人发表于 2015-12-14 07:03:37
    love 0

    注意到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–内存 限制内存测试,做了一点点修改,加入了开始和结束时间,请原谅我不懂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的变化

    参考资料

    • Linux Shell: 统计系统中占用Swap 的程序PID和占用大小
    • Docker基础技术:Linux CGroup
    • Linux资源管理之cgroups简介 – 美团技术团队
    • 用 cgruops 管理进程内存占用
    • Linux下使用zram(压缩内存)
    • 创新的Linux zswap压缩功能
    • Transparent Memory Compression in Linux
    • MAC下的内存压缩算法WKdm


沪ICP备19023445号-2号
友情链接