当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : zram设置为lz4后的读取速度竟然低于lzo?
帖子发表于 : 2017-08-03 18:26 

注册: 2013-05-26 6:58
帖子: 2035
系统: Debian 9
送出感谢: 851
接收感谢: 25
Debian 4.9内核中zram的各种算法的简单测试结果
本以为zram的新压缩算法可以"以时间换空间",没想到mem_used_total全是16777216
个人猜测是zsmalloc的问题.
还有就是zram中的lzo不论写入还是读取都比lz4更快?
记得以前看各种资料都说lz4无害压缩速度,解压速度比lzo更快.
个人猜测也许zram或zsmalloc作者对默认的lzo有更多的测试,调试,和优化工作?

测试结果(也许测试用数据太极端(几乎是压缩的最好情况),可参考另一个测试):
代码:
$ source ./tmpscript
deflate
[deflate]write
536870912 bytes (537 MB, 512 MiB) copied, 13.8869 s, 38.7 MB/s
[deflate]mm_stat
536870912  3276800 16777216        0 16777216        0        0
[deflate](compacted)mm_stat
536870912  3276800 16777216        0 16777216        0        0
[deflate]read
536870912 bytes (537 MB, 512 MiB) copied, 1.73418 s, 310 MB/s
lzo
[lzo]write
536870912 bytes (537 MB, 512 MiB) copied, 2.47235 s, 217 MB/s
[lzo]mm_stat
536870912  5767168 16777216        0 16777216        0        0
[lzo](compacted)mm_stat
536870912  5767168 16777216        0 16777216        0        0
[lzo]read
536870912 bytes (537 MB, 512 MiB) copied, 1.32582 s, 405 MB/s
lz4hc
[lz4hc]write
536870912 bytes (537 MB, 512 MiB) copied, 14.4807 s, 37.1 MB/s
[lz4hc]mm_stat
536870912  3670016 16777216        0 16777216        0        0
[lz4hc](compacted)mm_stat
536870912  3670016 16777216        0 16777216        0        0
[lz4hc]read
536870912 bytes (537 MB, 512 MiB) copied, 1.53962 s, 349 MB/s
lz4
[lz4]write
536870912 bytes (537 MB, 512 MiB) copied, 2.5872 s, 208 MB/s
[lz4]mm_stat
536870912  3670016 16777216        0 16777216        0        0
[lz4](compacted)mm_stat
536870912  3670016 16777216        0 16777216        0        0
[lz4]read
536870912 bytes (537 MB, 512 MiB) copied, 1.55211 s, 346 MB/s
$


tmpscrip:
代码:
test ()
{
algorithm=$1
sudo modprobe -r zram
sudo modprobe zram num_devices=1
echo ${algorithm} | sudo tee /sys/block/zram0/comp_algorithm
echo 512M |sudo tee /sys/block/zram0/disksize >/dev/null
echo \[${algorithm}\]write
yes 12 | sudo dd of=/dev/zram0 |& tail -n 1
echo \[${algorithm}\]mm_stat
cat /sys/block/zram0/mm_stat
echo 1 | sudo tee /sys/block/zram0/compact >/dev/null
echo 1 | sudo tee /proc/sys/vm/compact_memory >/dev/null
sleep 1
echo \[${algorithm}\]\(compacted\)mm_stat
cat /sys/block/zram0/mm_stat
echo \[${algorithm}\]read
sudo dd of=/dev/null if=/dev/zram0 |& tail -n 1
}

test deflate
test lzo
test lz4hc
test lz4


_________________
Linux桌面优化综合贴[2017.09.18](欢迎各位补充或指正误区)
[2016.03.10]会C语言但看不懂英文文档的点这里,一个用C语言编写的简陋学习工具
单硬盘通过iso文件实机安装Debian的方法
重启或操作fcitx时失去响应的一个解决方法,不妨试试看


最后由 科学之子 编辑于 2017-08-17 23:00,总共编辑了 6 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: zram设置为lz4后的读取速度竟然低于lzo?
帖子发表于 : 2017-08-03 19:57 
头像

注册: 2008-09-18 13:11
帖子: 2646
送出感谢: 1
接收感谢: 423
你在写入时的dd前后各看一下mm_stat呢?


页首
 用户资料  
 
3 楼 
 文章标题 : Re: zram设置为lz4后的读取速度竟然低于lzo?
帖子发表于 : 2017-08-03 20:41 

注册: 2013-05-26 6:58
帖子: 2035
系统: Debian 9
送出感谢: 851
接收感谢: 25
astolia 写道:
你在写入时的dd前后各看一下mm_stat呢?

写入前mm_stat的全部字段都是0.


_________________
Linux桌面优化综合贴[2017.09.18](欢迎各位补充或指正误区)
[2016.03.10]会C语言但看不懂英文文档的点这里,一个用C语言编写的简陋学习工具
单硬盘通过iso文件实机安装Debian的方法
重启或操作fcitx时失去响应的一个解决方法,不妨试试看


页首
 用户资料  
 
4 楼 
 文章标题 : Re: zram设置为lz4后的读取速度竟然低于lzo?
帖子发表于 : 2017-08-03 20:51 
头像

注册: 2008-09-18 13:11
帖子: 2646
送出感谢: 1
接收感谢: 423
astolia 写道:
你在写入时的dd前后各看一下mm_stat呢?


页首
 用户资料  
 
5 楼 
 文章标题 : Re: zram设置为lz4后的读取速度竟然低于lzo?
帖子发表于 : 2017-08-03 21:16 

注册: 2013-05-26 6:58
帖子: 2035
系统: Debian 9
送出感谢: 851
接收感谢: 25
astolia 写道:
astolia 写道:
你在写入时的dd前后各看一下mm_stat呢?

写入前全部字段是0,写入后就像贴出来的结果一样.


_________________
Linux桌面优化综合贴[2017.09.18](欢迎各位补充或指正误区)
[2016.03.10]会C语言但看不懂英文文档的点这里,一个用C语言编写的简陋学习工具
单硬盘通过iso文件实机安装Debian的方法
重启或操作fcitx时失去响应的一个解决方法,不妨试试看


页首
 用户资料  
 
6 楼 
 文章标题 : Re: zram设置为lz4后的读取速度竟然低于lzo?
帖子发表于 : 2017-08-03 22:22 
头像

注册: 2008-09-18 13:11
帖子: 2646
送出感谢: 1
接收感谢: 423
astolia 写道:
你在写入时的dd各看一下mm_stat呢?
科学之子 写道:
写入后就像贴出来的结果一样.

你确定dd后的结果和你贴出来的sleep后的结果是一样的?



_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
7 楼 
 文章标题 : Re: zram设置为lz4后的读取速度竟然低于lzo?
帖子发表于 : 2017-08-04 3:04 

注册: 2013-05-26 6:58
帖子: 2035
系统: Debian 9
送出感谢: 851
接收感谢: 25
astolia 写道:
astolia 写道:
你在写入时的dd各看一下mm_stat呢?
科学之子 写道:
写入后就像贴出来的结果一样.

你确定dd后的结果和你贴出来的sleep后的结果是一样的?

确定,其实我最先测试的是没有compact和sleep的版本
发现这些算法的mem_used_total都相同,于是尝试compact,发现所有算法的mem_used_total仍然相同
然后觉得compact可能需要一些时间来完成,就又加上了sleep
最后全部算法的mem_used_total还是相同的.

经过您的提醒,我已经编辑了主题帖,加上了compact前后的mm_stat对比


_________________
Linux桌面优化综合贴[2017.09.18](欢迎各位补充或指正误区)
[2016.03.10]会C语言但看不懂英文文档的点这里,一个用C语言编写的简陋学习工具
单硬盘通过iso文件实机安装Debian的方法
重启或操作fcitx时失去响应的一个解决方法,不妨试试看


页首
 用户资料  
 
8 楼 
 文章标题 : Re: zram设置为lz4后的读取速度竟然低于lzo?
帖子发表于 : 2017-08-04 10:56 
头像

注册: 2008-09-18 13:11
帖子: 2646
送出感谢: 1
接收感谢: 423
看了下 https://www.kernel.org/doc/Documentatio ... block-zram,compact做的是类似磁盘碎片整理的工作,而且最后的pages_compacted是0说明了compact并没有做什么事

我在虚拟机上的ubuntu 16.04上测了一下,内核是4.4。mem_used_total是有区别的
lzo: 536870912 5767168 8388608 0 8388608 0 0
lz4: 536870912 3670016 6291456 0 6291456 0 0

一个显著的现象是对于compr_data_size,lzo是远大于lz4的。如果你去读zram的代码,就知道现在的zram模块并没有包含任何压缩算法,全部是交给内核的crypto api来做。

只能说内核的lzo库实现牺牲了压缩率来实现高速化。如果用自带算法的用户态程序lzop和lz4做同样的实验,那么对lz4和lzo的一般性论断(lz4速度高于lzo,压缩率比lzo略差)还是成立的



_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
9 楼 
 文章标题 : Re: zram设置为lz4后的读取速度竟然低于lzo?
帖子发表于 : 2017-08-06 19:00 

注册: 2013-05-26 6:58
帖子: 2035
系统: Debian 9
送出感谢: 851
接收感谢: 25
也许是1楼测试用数据太极端了
Wed Aug 23 22:56:55 CST 2017{想了一个可靠的测试方法,懒得贴代码了
过程就是用下列程序占掉内存,然后备份作为swap设备的zram
然后把备份后的镜像写入各自算法的zram进行比较,如此各个算法处理的数据可以确保精确相同
重新的测试结果表明lzo速度比lz4稍慢,压缩率比lz4少好}

下面的测试数据来源不可精确控制
重新测试的结果表明lzo的(mem_used_total/orig_data_size)比lz4更好(更小)
重新测试了一下:
环境:
代码:
$ uname -a
Linux debian 4.9.0-3-686-pae #1 SMP Debian 4.9.30-2+deb9u2 (2017-06-26) i686 GNU/Linux

测试细节:
代码:
$ source maxswaptest
sudo /etc/init.d/zram stop
real   0m0.599s
sudo /etc/init.d/zram start deflate
real   0m0.111s
time ./a.out 2048 r  1 30
real   0m31.172s
[deflate]mm_stat
469659648 106177535 115027968        0 136069120     2776        8
sudo /etc/init.d/zram stop
real   0m42.506s
sudo /etc/init.d/zram start lzo
real   0m0.527s
time ./a.out 2048 r  1 30
real   0m22.937s
[lzo]mm_stat
684240896 204986478 217817088        0 237568000     3804      344
sudo /etc/init.d/zram stop
real   1m4.671s
sudo /etc/init.d/zram start lz4hc
real   0m0.364s
time ./a.out 2048 r  1 30
real   0m31.008s
[lz4hc]mm_stat
474968064 115749933 124841984        0 140357632     3621     1710
sudo /etc/init.d/zram stop
real   0m49.199s
sudo /etc/init.d/zram start lz4
real   0m0.244s
time ./a.out 2048 r  1 30
real   0m24.244s
[lz4]mm_stat
656371712 198882702 212914176        0 236359680     4013     2876
$


maxswaptest:

代码:
test ()
{
echo "sudo /etc/init.d/zram stop"
(time sudo /etc/init.d/zram stop) |& grep '^real'
echo "sudo /etc/init.d/zram start $1"
(time sudo /etc/init.d/zram start $1) |& grep '^real'
echo 'time ./a.out 2048 r  1 30'
(time ./a.out 2048 r  1 30) |& grep '^real'
echo \[$1\]mm_stat
cat /sys/block/zram0/mm_stat
}
test deflate
test lzo
test lz4hc
test lz4


/etc/init.d/zram:
代码:
#!/bin/sh
### BEGIN INIT INFO
# Provides:          zram
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Default-Start:     S
# Default-Stop:      0 1 6
# Short-Description: Use compressed RAM as in-memory swap
# Description:       Use compressed RAM as in-memory swap
### END INIT INFO

# Author: Antonio Galea <antonio.galea@gmail.com>
# Thanks to Przemysław Tomczyk for suggesting swapoff parallelization
# Distributed under the GPL version 3 or above, see terms at
#      https://gnu.org/licenses/gpl-3.0.txt

FRACTION=200

MEMORY=`perl -ne'/^MemTotal:\s+(\d+)/ && print $1*1024;' </proc/meminfo`
#CPUS=`grep -c processor /proc/cpuinfo`
#swap_cache_pressure=29
#max_swap_priority=32767
#CPUS=$swap_cache_pressure
CPUS=1
SIZE=$(( MEMORY * FRACTION / 100 / CPUS ))
case "$1" in
  "start")
    echo 100 >/proc/sys/vm/swappiness
    echo 0 >/proc/sys/vm/page-cluster
    echo 0 >/proc/sys/vm/extfrag_threshold
    param=`modinfo zram|grep num_devices|cut -f2 -d:|tr -d ' '`
    modprobe zram $param=$CPUS
    for n in `seq $CPUS`; do
      i=$((n - 1))
      #echo 2 >/sys/block/zram$i/max_comp_streams
      echo $2 >/sys/block/zram$i/comp_algorithm
      echo $SIZE >/sys/block/zram$i/disksize
      mkswap /dev/zram$i
      #swapon /dev/zram$i -d -p $((max_swap_priority-i))
      swapon -p 10 /dev/zram$i
    done
    #echo 32767 >/proc/sys/vm/vfs_cache_pressure
    echo 1 >/proc/sys/vm/compact_memory
    #echo 0 >/proc/sys/vm/min_free_kbytes
    #echo 1 >/proc/sys/vm/lowmem_reserve_ratio
    #echo 0 >/proc/sys/vm/admin_reserve_kbytes
    ;;
  "stop")
    echo 60 >/proc/sys/vm/swappiness
    echo 3 >/proc/sys/vm/page-cluster
    echo 500 >/proc/sys/vm/extfrag_threshold
    #echo 100 >/proc/sys/vm/vfs_cache_pressure
    #echo 42980 >/proc/sys/vm/min_free_kbytes
    #echo 256 >/proc/sys/vm/lowmem_reserve_ratio
    #echo 8192 >/proc/sys/vm/admin_reserve_kbytes
    for n in `seq $CPUS`; do
      i=$((n - 1))
      swapoff /dev/zram$i && echo "disabled disk $n of $CPUS"
    done
    wait
    sleep .5
    modprobe -r zram
    ;;
  "compact")
    for n in `seq $CPUS`; do
      i=$((n - 1))
      echo 1 >/sys/block/zram$i/compact
    done
    echo 1 >/proc/sys/vm/compact_memory
    ;;
  *)
    echo "Usage: `basename $0` (start | stop | compact)"
    exit 1
    ;;
esac


a.out:
代码:
//usage:
//indent ./zramswaptest.c;gcc -O0 ./zramswaptest.c
//./a.out max r/w repeat timeout

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int
main (int argc, char **argv)
{
  time_t const start_time = time (NULL);
  time_t timeout;
  int max;
  int repeat;
  if (argc == 5)
    {
      max = atoi (argv[1]);
      repeat = atoi (argv[3]);
      timeout = ((time_t) (atoi (argv[4])));
    }
  else
    return 1;

  unsigned char **block_array =
    calloc (sizeof (unsigned char *), (size_t) (max));

  size_t block_length = (size_t) (1024u * 1024u);

  unsigned char data[3];
  data[0] = 'a';
  data[1] = 'b';
  data[2] = 'c';

  unsigned i = 0u;
  //initialize block_array
  for (i = 0u; i < max; i++)
    {
      do
   {
     if ((timeout > ((time_t) (0)))
         && ((time (NULL) - start_time) > timeout))
       {
         printf ("%u:timeouted!\n", i);
         return 0;
       }
     block_array[i] = malloc (block_length);
     if (block_array[i] != NULL)
       {
         unsigned bi = 0u;
         for (bi = 0u; bi < block_length; bi++)
      block_array[i][bi] = data[bi % ((unsigned) (sizeof (data)))];
       }
     else
       {
         printf ("%u error\n", i);
       }
   }
      while (NULL == block_array[i]);
    }
  puts ("init ok");
  unsigned score = 0u;
  if (0 == repeat)
    goto show_score;
//do page read test
  if ('r' == argv[2][0])
    for (;;)
      {
   for (i = 0u; i < max; i++)
     {
       if ((timeout > ((time_t) (0)))
      && ((time (NULL) - start_time) > timeout))
         {
      puts ("timeouted!");
      goto show_score;
         }

       unsigned bi = 0u;
       for (bi = 0u; bi < block_length; bi++)
         {
      data[bi % ((unsigned) (sizeof (data)))] = block_array[i][bi];
         }
       score++;
     }
   if (repeat > 0)
     {
       repeat--;
       if (0 == repeat)
         goto show_score;
     }
      }
//do page write test
  else if ('w' == argv[2][0])
    for (;;)
      {
   for (i = 0u; i < max; i++)
     {
       if ((timeout > ((time_t) (0)))
      && ((time (NULL) - start_time) > timeout))
         {
      puts ("timeouted!");
      goto show_score;
         }

       unsigned bi = 0u;
       for (bi = 0u; bi < block_length; bi++)
         {
      block_array[i][bi] = data[bi % ((unsigned) (sizeof (data)))];
         }
       score++;
     }
   if (repeat > 0)
     {
       repeat--;
       if (0 == repeat)
         goto show_score;
     }
      }
show_score:
  printf ("score:%u\n", score);
  return 0;
}


_________________
Linux桌面优化综合贴[2017.09.18](欢迎各位补充或指正误区)
[2016.03.10]会C语言但看不懂英文文档的点这里,一个用C语言编写的简陋学习工具
单硬盘通过iso文件实机安装Debian的方法
重启或操作fcitx时失去响应的一个解决方法,不妨试试看


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译