当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 为何感觉zram算法设置为deflate时比lzo更少整个系统卡死?
帖子发表于 : 2017-09-06 22:58 

注册: 2013-05-26 6:58
帖子: 2137
系统: Debian 9
送出感谢: 879
接收感谢: 30
为何感觉zram算法设置为deflate时比lzo更少整个系统卡死?
细节:
并没有发现lzo压缩效果比deflate差很多之类(压缩率相差约10%,由于数据极端重复,测试环境中lzo占用总空间也就最多约200MB(有点记不清了,只记得约deflate占用总空间的200%.)
单纯比较time计时,设置为lzo时确实也更快完成运行.
但是无限循环运行时明显感觉到整个系统卡的比deflate厉害,但我找不出数值化的测试方法.
测试步骤:
把系统设置为单核状态(非必须,只是为了方便占满CPU核心)
(2048是以MB为单位,是测试环境中物理内存的总容量)
代码:
time ./zramtest.out 2048 r  -1 -1

zramtest.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时失去响应的一个解决方法,不妨试试看


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 为何感觉zram算法设置为deflate时比lzo更少整个系统卡死?
帖子发表于 : 2017-09-09 21:23 
头像

注册: 2008-09-18 13:11
帖子: 2769
送出感谢: 1
接收感谢: 448
看看两种情况下vmstat的输出



_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
3 楼 
 文章标题 : Re: 为何感觉zram算法设置为deflate时比lzo更少整个系统卡死?
帖子发表于 : 2017-09-10 17:45 

注册: 2013-05-26 6:58
帖子: 2137
系统: Debian 9
送出感谢: 879
接收感谢: 30
astolia 写道:
看看两种情况下vmstat的输出

(字段是手动观察,没有用脚本做自动比较)lzo卡的时候(有时lzo明显比deflate流畅,但卡死时比deflate更彻底)vmstat的b字段达到20,in字段则是0 .
deflate卡的时候(deflate基本上一直处在卡的状态,但没lzo卡死时的那么彻底)vmstat的b字段最高为6,in字段大多数情况位置在1000~2000
si和so没看出什么异常,lzo的每秒si/so(速度)远高于deflate,符合预期.

结果是排版混乱看错了...用awk按照位置重新看了一下是bo为0,in没看出什么不正常来
不过lzo卡的时候b字段增加很多是确定无疑了.

如果单纯运行1楼的程序,lzo 更流畅,lzo 测试期间若尝试启动firefox或mplayer则很快整个系统卡死(包括tty),响应等待时间明显长于deflate.
如果单纯运行1楼的程序,deflate明显卡的更厉害(个人感觉相比lzo那种卡的动不了的程度,deflate卡的程度更容易接受),但deflate测试期间尝试启动firefox或mplayer时卡的程度也没什么大变化,tty什么的也基本工作正常.

搜到了这个: https://lwn.net/Articles/660629/
按照链接文章作者的说法也是deflate在X86表现比lzo更好,链接文章作者猜测是压缩率的区别导致的.
不过在我的测试环境下lzo和deflate只相差10%,并且测试程序填写的数据是高度重复(可压缩)的.
感觉问题的主要原因不是出在压缩率上.
通过您的提示,观察vmstat,感觉更像是很多进程陷入不可中断的状态导致卡的很彻底,但不知lzo陷入这种状态的原因是什么.


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


最后由 科学之子 编辑于 2017-09-11 3:10,总共编辑了 3 次

页首
 用户资料  
 
4 楼 
 文章标题 : Re: 为何感觉zram算法设置为deflate时比lzo更少整个系统卡死?
帖子发表于 : 2017-09-10 22:01 

注册: 2013-05-26 6:58
帖子: 2137
系统: Debian 9
送出感谢: 879
接收感谢: 30
看了下deflate.c,里面有包含interrupt.h,但没看懂哪里用了interrupt.h的内容
我还看了lzo.c和lz4.c都没发现interrupt.h或其它以我能力能找到的中断处理代码
其它算法我就没看了
我刚测了一遍lz4,跟lzo一样的卡死.
所以我猜测Linux 4.9实现中lzo跟lz4都不可中断,但deflate可中断?(如有错误还请各位指正)


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


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 为何感觉zram算法设置为deflate时比lzo更少整个系统卡死?
帖子发表于 : 2017-09-11 18:48 

注册: 2013-05-26 6:58
帖子: 2137
系统: Debian 9
送出感谢: 879
接收感谢: 30
又测试了速度跟deflate相近的lz4hc
发现卡的程度也跟deflate一样,没有出现lzo那样卡的程度.
看lz4hc的代码也跟lzo,lz4一样没有包含interrupt.h,应该跟interrupt.没关系.
现在猜测是:测试用程序死循环加上swap-out太快导致内存里正常(非测试用)程序的页面被不停迅速(lzo 和 lz4 的速度)淘汰,导致几乎整个系统卡死.
这么看来swap设备速度太快还有副作用了? :Aadterboom
猜测若有错误欢迎各位指正.


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


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

当前时区为 UTC + 8 小时


在线用户

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


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

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

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