比较gzip压缩和解压缩性能

Benchmark gzip compression and decompression performance

gzip是很多测序数据的默认压缩格式。在学校HPC环境中,几个GB的文件的压缩和解压缩往往需要几分钟到几十分钟的时间。如果处理的数据较大,gzip的压缩和解压缩会占用不少时间。因此我想看看有没有比Linux默认的gzip更有效率的软件。这里主要比较:

  1. libdeflate 这是samtools的选择
  2. igzip 这包含在Intel ISA-L软件中
  3. pigz 这是gzip的多线程实现

具体的测试分为压缩和解压缩两部分。用的是一个FASTQ文件,压缩后大约2G,原始文件6G。

测试结果如下:

Decompression
User Time (s)Real Time (s)Memory
gzip39.73u1.47s41.24r876kB
igzip7.60u1.81s11.31r2844kB
libdeflate20.45u6.53s28.05r7909292kB
pigz30.18u4.86s23.49r1000kB
Decompression Benchmark
Compression
User Time (s)Real Time (s)MemoryCompressed File Size
gzip620.17u2.54s623.23r1116kB1.81G
igzip15.61u1.92s17.69r2628kB2.03G
libdeflate152.88u10.29s163.43r7879072kB1.78G
pigz995.38u4.15s18.18r38352kB1.82G
Compression Benchmark

结论:Intel igzip在耗时指标中完胜。在默认设置下,igzip解压缩时间是系统提供gzip的1/5,压缩时间是1/40。唯一不足的是压缩后的文件偏大。

讨论:

这个结果和samtools 的benchmark差别很大。我发现samtools用的GitHub仓库(https://github.com/jtkukunas/zlib)不同于Intel Tuning Guide里提供的仓库(https://github.com/intel/isa-l/blob/master/README.md)。 因此性能的差别可能来源于samtools没有用官方的实现,当然也有可能是测试方法不同:samtools测量的是bam文件的读写速度,而我只是用FASTQ文件作为测试。

其他相关的gzip工具还有zlib-ng 和cloudflare优化的zlib。这些性能应该在igzip和系统自带的gzip之间,这里就不再测试了。

节省编译时间的工具

节省编译时间的工具
Tools save compiling time

最近发现编译C++程序很花时间。
比如说仅仅编译一个用了模版库的程序需要花10秒。
为了加快开发速度,我想找一个能提高单机编译速度的程序。结果如下:

[table caption=”Benchmark” width=”500″ colalign=”left|left|right|right|right”]
Program,UserTime (s),SysTime (s),RealTime (s)[attr style=”color:red” sort=”desc”],Memory (kB)
g++-4.9.4,137.35u,10.11s,56.44r,1392268kB
clang++-4.0,93.24u,6.56s,36.21r[attr style=”color:red” sort=”desc”],949524kB
zapcc++-1.0,1.81u,0.57s,33.95r[attr style=”color:red” sort=”desc”],39888kB
ccache-g++ (1st),109.62u,9.01s,49.43r,1392392kB
ccache-g++ (2nd),1.47u,0.87s,1.67r[attr style=”color:red” sort=”desc”],55832kB
[/table]

结论:
从编译速度来看,首次编译速度最快的是zapcc(不免费)和clang(免费),耗时~35秒左右,比g++快40%。
重复编译的时候ccache最快,提速10倍以上。

注:表中zapcc的用户时间很短,内容占用少,这是因为它是起动其他进程去真正编译,其他程序的用户时间和内存使用没有被计入。

建立SFTP共享账户

建立SFTP共享账户
Create SFTP share account

做学术的时候往往需要交流数据。目前最安全简便的解决方案是用SFTP传输文件协议。
为此,需要配置Linux服务器,并为学术伙伴建立一个不能登录、只能用SFTP的账号。

下面是步骤:

1. 建立用户组

addgroup --system filetransfer

2. 设定用户目录和相应权限
以用户名username为例:

mkdir /home/username
mkdir /home/username/data
chown root:root /home/username
chown username:filetransfer /home/username/data
chmod 755 /home/username
chmod 700 /home/username/data

权限755可以允许sftp用户登录到其HOME目录/home/username
权限700可以防止上传的数据被其他用户访问

3. 建立用户

useradd -d /home/username -s /usr/lib/sftp-server -M -N -g filetransfer username

-d 指定HOME目录
-s 指定登录shell
-M 不创建HOME目录
-N 不创建以username为名的 用户组
-g 指定user group

4. 配置ssh

打开 /etc/ssh/sshd_config

见到这行之后:Subsystem sftp /usr/lib/openssh/sftp-server
改称:Subsystem sftp internal-sftp
然后在末尾加上:

Match group filetransfer
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

5. 配置登录shell

在/etc/shells末尾加上一行:

/usr/lib/sftp-server

6. 最后重启ssh 服务器就好了

service ssh restart