(发布于 April 3, 2013, 意译于12/9/2016) 原文链接 :https://lwn.net/Articles/545244/ 另一个版本的翻译(有些句子没有翻): http://kernel.taobao.org/index.php?title=%E5%86%85%E6%A0%B8%E6%9C%88%E6%8A%A52013-04#In-kernel_memory_compression 吐槽 : 我的天呐!!翻译完我才发现有人翻译过了,早知道我就不自己翻译了,痛苦死我了。。 PS :内容我还没有完全理解,仅供参考,以原文为准。 阿姆达尔定律告诉我们一个计算机系统肯定存在一个瓶颈。历史上,对于很多工作负载这个瓶颈都是cpu,所以人们在不断提升cpu性能。所以现在,渐渐地,ram成为了瓶颈。有时当数据在ram和disk之间来回传递时,cpu就在一边干瞪眼呢。增大ram有时并不是一个好的或者经济的做法,更快的I/O或者ssd可以缓解问题,但是不能消除这个瓶颈。 如果可以增大ram中数据的有效容量,不是很好吗?既然cpu闲置,也许我们可以拿闲置的cpu周期来专注这件事。这就是内核内压缩的目标:用闲置的cpu周期来做ram中的压缩和解压缩。 算上刚刚发布的zswap,现在有3个内核内实现的压缩方法在被建议merge到内核的内存管理(memory management, MM) 子系统:zram, zcache和zswap。乍一看可能会让人觉得一个就够了吧,但是他们三个却有很大的不同,可能面向着不同的用户群。所以就像现在内核中存在很多文件系统一样,有一天内核中也会存在多种压缩方案吧,不过这还得李纳斯大神和主要的内核开发者说了算。。。为了方便说明,本文把这些方案统称“zproject”,并对比了这些方案。我们先说明一些关键原则和压缩遇到的挑战。然后我们会从三个层次说明并详细地阐释这些zprojects设计上的不同选择,之后我们还讨论zprojects怎么和内核其他部分交互,最后给出结论。 压缩基础 要让压缩在内核中工作,内核必须把字节序列放入内存中再压缩,之后内存中也应保有压缩后的版本,以备这些数据被再次使用。压缩状态下的数据不能被读写,所以对压缩版本的数据再进行解压缩后才能继续读写这些数据。 字节序列压缩多少都可以,但还是以一个固定大小的单元压缩较方便。贯穿整个内核的一种基本的存储单元是page,一个page由PAGE_SIZE个字节组成,通常的linux支持的架构中,page的大小是4KB。如果这个page对准了PIGE_SIZE的地址分界,那么它就被称为page frame。对于每个page frame,内核在ram中都有相应的struct page结构。所有这三个zprojects都用page作为压缩的单元,并且通过开辟和管理page frames来存储压缩页。 有很多可用的压缩算法,但总的来说,高压缩比意味着高cpu周期,运行的快的算法一般压缩比较低。在时间效率和压缩率之间做出权衡很重要。这三种zprojects,默认都使用内核lib/文件夹中的LZO(1X)算法,这种算法做出了很好的权衡。然而,算法的选择还是很灵活的,也许cpu运行的算法还会被一些特殊架构的硬件压缩引擎取代呢。 一般,存在一些数据一会儿压缩一会儿解压缩的循环,数据序列大概和序列中的字节数成正比。因为页比较大,页压缩和解压缩都是很昂贵的操作,所以我们希望限制这些操作的数量。因此我们必须谨慎的选择哪些页要被压缩,尽可能找到那些可能会被再次用到同时最近不会用的页,以免把cpu时间浪费在重复的压缩然后立刻又解压缩上。因为压缩页不能直接访存某个字节,我们必须要保证内核清楚地辨识出哪个是压缩页,避免对压缩页中的字节尝试cpu的线性地址操作,同时保证压缩页可以被找到并可以在被访问时解压缩。

我发现。。shell脚本貌似不像C或者Python一样自带注释语法,不过拐弯抹角还是有一些方法的。。囧 方法1:利用逻辑语句 利用了逻辑语句的执行顺序,缺点是注释中不能出现括号,否则会报错! ###逻辑或前如果为真,后边的语句块自动不执行 #1 :||{ 注释内容… } #2 ((1))||{ 注释内容… } #3 true||{ 注释内容… } ###逻辑与前如果为假,后边的语句块自动不执行 #4 ((0))&&{ 注释内容… } <!–more–> #5 false&&{ 注释内容… } 方法2:利用Here Documents语法 利用了shell脚本的here documents的语法,注意<<后边是自己命名的,做到前后呼应即可,如下为两例,但是我测试的几种命名只有例1中的方法没有什么缺点,在例二或者其他命名中,如果出现反单引号`则可能会报错! #e.g. 1 :<<” 注释内容… ” #e.g. 2 :<< BLOCK 注释内容… BLOCK 方法3:利用sed命令 如果是使用vim编辑,利用sed语法,vim中的normal模式下: #全文注释: :0,$ s/^/#/ #m到n行注释: :m,n s/^/#/ #全文去注释: :0,$ s/^#// #m到n行去注释: :m,n s/^#// […]

最近由于需要实现从一个客户端电脑定时远程上传图片到阿里云服务器的功能,需要实现SCP的免密码传输。所以查资料并做了一个记录,希望对大家有帮助。 步骤 1.Client上某用户执行ssh-keygen命令,生成建立安全信任关系的证书 ssh-keygen -b 1024 -t rsa 这里如果~/.ssh/id_rsa.pub 已经存在,说明以前已经生成过,可以直接跳过这步。 2.将公钥证书id_rsa.pub内容复制到Server某用户的~/.ssh/authorized_keys目录中 ## 方法1 scp -p ~/.ssh/id_rsa.pub [username]@[server_ip]:[user_home]/.ssh/authorized_keys ## 方法2 client: cat ~/.ssh/id_rsa.pub #然后复制它 server: vim ~/.ssh/authorized_keys #然后粘贴保存 3.使用方法 #已经不需要输入密码 #比如ssh登录: <!–more–> ssh [user_name]@[ip_address] #再如scp传输文件: scp [path_to_file] [user_name]@[ip_address]:[dir_path]

这是我学习sed的一个总结,只限于自己和比我水平低(就是没接触过)的同学看。。。除了参考资料,讲解也包括很大成分的个人理解,如果发现错误,希望大家可以提醒我及时更正,谢谢~! sed概述 sed是一个流编辑器,更准确的说是一个行编辑器,就是sed处理文本处理命令用于逐行处理文本中的文字。 这是sed命令的格式: sed [options] [commands] [input-file] 就是说sed命令一般由“sed”、选项、命令和待处理文本文件组成。 举个例子: 对于文本test.txt: this is the first line. the 2nd line. hello, this is the 3rd line. 命令sed -n ‘/hello/p’ test 就会产生以下输出: hello, this is the 3rd line. 其中-n选项表示屏蔽sed默认输出。单引号中/hello/表示匹配带有”hello”的行p代表打印所匹配的行。 sed执行的流程 读取一行到模式空间缓冲区

常用git,做个记录,方便查询,利人利己,如有错误,欢迎指正~ 创建仓库 git init 创建仓库 git clone xxx.git(远程库的地址) 克隆一个远程仓库 git remote add origin xxx.git(远程库的地址) 指定一个远程仓库地址,命名为origin 提交更改 git rm file_name 删除文件 git add file_name 添加文件到仓库暂存区(index) git commit -m “xxx” 提交更改给仓库 git commit -am “xxx” 上两条的终极合体,添加所有已追踪文件的更改到暂存区,并提交 git log 显示提交日志 git status 显示当前仓库状态 git push [-f] [remote_name] [branch_name] 上传到远程仓库,加-f表示强制覆盖远程仓库的上传(要谨慎)

准备工作 环境:Ubuntu 14.04 32bit 工具:dnspython 对应的shell工具:nslookup dig等 dns预备知识: 常用资源记录RR(Resource Records)类型 A记录: 主机名–> IP地址 MX记录: 定义邮件服务器域名 CNAME: 域名间映射 PTR: IP地址 –>主机名(反向解析) 更详细介绍参考博文《 [DNS]常见资源记录定义(Resource Record) 》 用法举例 查询A记录 import dns.resolver domain = raw_input(‘input an domain:’) A = dns.resolver.query(domain, ‘A’) for i in A.response.answer: for j in i.items: if ‘address’ in dir(j): print j.address else: print ‘failed to […]

环境:ubuntu 14.04 32bit 工具:psutil 对应的shell工具:ps top lsof netstat ifconfig who df kill nice free ionice iostat iotop uptime pidof tty taskset pmap 安装: 采用pip可以安装pip install psutil。(注意需要安装python-dev: sudo apt-get install python-dev) 用法举例: 获取信息 cpu信息: psutil.cpu_times() #cpu完整信息 psutil.cpu_count(logical=False) #cpu物理个数 logical默认为True即cpu逻辑个数 内存信息: mem = psutil.virtual_memory() <!–more–> print mem.total print mem.free print mem.swap_memory() # sswap分区信息 磁盘信息 网络信息 其他信息 进程管理 […]