Linux

  • CentOS 7/8目前已经不再更新,如果不打算使用CentOS Stream、RHEL的话,最主要的选择是AlmaLinux和Rocky Linux。对于一般的开发者来说,两者并没有太大区别,使用体验都100%兼容RHEL,也与原来的CentOS几乎相同。从其他方面,这里来对比一下AlmaLinux和Rocky Linux。

    生态情况

    双方都声称自己的生态非常好,不看广告看疗效,这里通过对比主要云厂商对于这两个发行版的支持来粗略判断其生态情况。统计数据如下:

    从数据上看,Rocky Linux略胜一筹(6分 VS 5分)。也顺便统计了,所有的Linux发行版在各个云的默认支持情况,其他几个值得关注的发行版包括:Ubuntu(8分)、RHEL(6分)、Debian(6分)、SUSE(5分)。

    详细的云厂商支持情况截图如下,该数据根据各个云厂商在ECS/VM/EC2的创建过程中,可以手动选择的、非云市场的Linux发型版本:

    这里给出的列表为云厂商在“默认推荐”中的发行版,例如,在AWS中被认为是 Commonly Used AMI、Azure上则是表现为在其镜像直接的选择列表中。列表中不包含,各个云厂商的自己的发行版,包括Amazon Linux、Alibaba Cloud Linux、Anolis OS、Oracle Linux、TencentOS、Baidu Linux等。

    Google Trend数据

    Google Trend也是非常好的代表流行度的指标,具体数据参考右图。可以看到,两个发行版都有不错的增长趋势,Rocky Linux则再次略胜一筹。

    此外,如果是非RHEL兼容的版本,那么Debian也是不错的选择。

    基金会架构

    AlmaLinux背后是Alma Linux基金会,这是一个非盈利机构(501(c)(6)),该机构最初由Cloudlinux(是一家商业公司)赞助,并还在持续赞助。相对来说,AlmaLinux有一定的独立性。

    Rocky Linux是由CentOS创始人创办,而且使用类似的架构。Rocky Linux依旧是以社区的形式运作,但是其商标、和其基金会是由商业公司拥有。

    官网

    小结

    最后,生态现状和受关注度上Rocky Linux更胜一筹;在公司架构上,AlmaLinux是一个最初由Cloudlinux资助建立的非盈利组织,Rocky Linux架构则与之前的CentOS类似由商业公司驱动。AlmaLinux、Rocky Linux两者就像“麦当劳”和“肯德基”,有人说麦当劳的鸡翅好吃,有人说肯德基的鸡米花好吃,也有很多人是尝不出来两者的区别的,根据偏好选择就好了。

    笔者给一个非常玄乎的建议,如果你的偏好是麦当劳,建议使用AlmaLinux,如果是KFC则建议Rocky Linux。如果你也无所谓,那么关于这两个选择也就无所谓,“点兵点将骑马打仗”就好了。

    参考:

    • https://wiki.almalinux.org/Comparison.html
    • https://www.reddit.com/r/AlmaLinux/comments/13050fo/why_almalinux_instead_of_rocky_linux/
  • 虽说标题是“Alibaba Cloud Linux”,不过对于Amazon Linux、华为云EulerOS/openEuler、TencentOS等都均适用。

    1. 添加自己的密钥对,方便本地快速登录:

    vi .ssh/authorized_keys

    2. 修改 sshd 配置,防止ssh会话经常断开:

    vim /etc/ssh/sshd_config
    
    ...
    ClientAliveInterval 30
    ClientAliveCountMax 3
    ...
    
    service sshd restart

    3. 修改本地的环境变量,包括语言、vim配置等

    vi .bash_profile 
    # 很多程序的错误提示,还是希望能够是英文的,更利于搜索
    export LANG=en_US.UTF-8
    export LANGUAGE=en_US
    
    # 更改为中国时区
    export TZ=Asia/Shanghai
    
    # root账号下,经常使用vi,其实想要vim
    # 当然,用root账号是非常不好的习惯
    alias vi="vim"
    
    # 配置一些vim的初始化的配置
    vi ~/.vimrc
    set number
    set tabstop=4
    set shiftwidth=4
    set expandtab
    syntax on

    4. 个人使用的省钱大法:在主机不使用的时候,可以使用“节省停机模式”关闭ECS。这样ECS最贵的计算和内存资源将不再收费。可以大大降低个人在测试使用的时候成本。目前,AWS、华为云、腾讯云等基本都支持该能力。缺点在于,每次重启后,可能会重新分配新的公网IP,使用上略有不便。不过,如果你已经有99块的ECS的话,每次以此为跳板机,使用内网IP跳转也是一个办法。

  • 在VPS上构建自己Blog

    ·

    随着各种SNS流行,写博客的人也越来越少,就连“博客伴侣”–Google Reader也关停了,写博客作为一个很好的分享和个人积累平台,一直坚持下来了,还将坚持下去。本文介绍自己如何在VPS上搭建自己的博客,这里使用”老派”的LAMP。随着云计算的流行,相信类似需求的人会增多,希望这篇博客能对其他人有点作用。

    1. 选择虚拟主机(VPS)

    这就是一件很烦人(因为穷)的事情。

    如果选择国内主机,则可以考虑阿里云,基础配置单核/512MB/5Mb带宽每年价格大概在650左右,如果放弃独享带宽(个人博客应该无所谓),则可以降价到460块。

    如果是国外主机的话,选择就比较多了,常见的有Linode,内存1GB的每年月1300元左右,因为有日本机房,所以对国外的主机来说,通常Linode速度更快(通常100ms-200ms);Dreamhost的VPS低配,300MB内存,每年约900元左右。常见选择还有Godaddy、budgetvm(便宜)等。

    我选择的是digitalocean,因为便宜,使用1个月了,速度也很稳定。

    digitalocean是最近兴起的极简云主机,号称55秒完成部署。整个购买、使用、付款都非常简洁,最大的特点是便宜,另外SSD硬盘也是一个亮点,经测磁盘性能确实不错,不过因为机房主要在欧美(纽约、旧金山、阿姆斯特丹)离国内都比较远,所以延迟较大,约300ms(ping一下我的博客就知道了,想想每次放我的博客,数据都从纽约过来,也就不觉得慢了)。价格比较便宜,360元每年,512MB内存,20GB磁盘。今年8月,digitalocean获得种子投资3百万美元2012年从TechStars孵化出来。非常喜欢digitalocean的极简原则,别人在把功能做多,他在把功能做少。希望,自己以后的工作也能够是这个样子,现在这份工作是没戏了,不好意思,说多了。

    2. 安装httpd+MySQL+PHP

    博客使用的是WordPress,需要PHP环境运行,这里选择了LAMP。安装非常快捷

    yum install httpd
    yum install mysql
    yum install php
    yum install php-mysql
    service httpd restart
    service mysqld restart or mysqld_safe &

    在MySQL中建好Wordpress需要使用的数据库用户。然后将Wordpress代码放到httpd的web目录中,在通过浏览器访问Wordpress就可以完成其配置。

    3. 配置httpd和MySQL的内存使用

    默认按照通常都能够跑起来,不过,如果按照默认配置跑,512MB很快会爆掉,从而出现OOM:

    Out of memory: Kill process 27968 (mysqld) score 146 or sacrifice child Killed process 27968, UID 27, (mysqld) total-vm:264472kB, anon-rss:73204kB, file-rss:36kB

    3.1 MySQL的配置

    设置50MB的InnoDB缓存空间,用于将Wordpress的内存缓存到内存中:

    innodb_log_buffer_size=30MB

    InnoDB的日志文件设置两组,每组50MB(这是消耗磁盘空间):

    innodb_log_file_size=50M innodb_log_files_in_group=2

    这样MySQL内存使用能够限制在约50MB。

    3.1 httpd的配置

    httpd配置需要特别注意,默认配置内存消耗可能很容易超过512MB的限制。httpd2.2版本,默认情况httpd使用模块置prefork来多线程管理。它的默认配置是:

    <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000</IfModule>

    这意味httpd最多可以起256个进程处理请求,每个进程约占用35MB(RES),而且只有闲置进程超过20个(MaxSpareServers)才会清理,所以,这个配置下,通常都有20个进程常驻,内存使用就很容易超过512MB了。

    下面是修改后的配置:

    <IfModule prefork.c> StartServers 3 MinSpareServers 2 MaxSpareServers 4 ServerLimit 256 MaxClients 10 MaxRequestsPerChild 100</IfModule>

    这样最大并发是10个进程,当限制进程超过4个的时候,就开始kill。对于我这种低压力个人博客,已经够了。

    最后,通常httpd使用模块prefork或者worker维护多线程,在这篇文章中Apache – prefork vs. worker mode, how to check mode and more,介绍了:(a)如何区分你使用哪个模块;(b)如何配置使用哪个模块;(c)他们的优缺点。

    4. 配置swap

    digitalocean的VPS默认是没有swap,所以内存一旦超出,则会立刻发生OOM。因为digitalocean以ssd为特点,所以直接用其磁盘来做一个swap分区弥补内存补足是非常好的。

    操作参考:Linux Add a Swap File – Howto

    在这自己购买VPS之前,一直蹭用Ningoo的Dreamhost主机,感谢。

    后续还会再考虑测试使用Google App Engine和Amazon AWS。

  • 在你的程序(或者工程)中,如果编译阶段需要检测当前环境中是否存在MySQL客户端相关的库文件时,你可以使用Autoconf来帮你完成这个工作,轻盈、优雅、无痛。阅读本文需要了解简单GNU Autoconf使用。

    1. 本文的目标

    目的:编译时,根据configure参数(如果有–with-mysql),选择性编译对应的MySQL相关的功能。

    实现:使用已经写好的m4脚本:ax_lib_mysql.m4

    2. 如何利用Autoconf实现

    大部分你想到的事情都已经有人做过尝试了。这件事情也不例外,Autoconf中有很多脚本和指令帮你做事情。这里,需要使用ax_lib_mysql.m4来帮助我们。先把该文件放到程序/工程目录中,并在configure.ac中新增如下指令来检测MySQL库文件和版本:

    m4_include(ax_lib_mysql.m4)
    AX_LIB_MYSQL()
    AM_CONDITIONAL(BUILD_MYSQL_SUPPORT, test x$MYSQL_VERSION != x)

    说明:AX_LIB_MYSQL()设置了三个变量,可以在Makefile.am中直接使用,分别是MYSQL_CFLAGS、MYSQL_LDFLAGS、MYSQL_VERSION,另外还会在config.h中预定义宏HAVE_MYSQL;AM_CONDITIONAL(…)则会根据是否需要开启MySQL支持,来设置变量BUILD_MYSQL_SUPPORT,这个变量可以在Makefile.am中使用。

    在程序源代码中一般有两种方式可以获取HAVE_MYSQL宏的方式:一个是直接包含config.h;另一个是在你程序的CFLAGS中新增-DHAVE_MYSQL。(注意:有的变量是可以在Makefile.am中使用,有的则是可以在C源代码中使用) (more…)

  • 前面一篇介绍了如何最大限度的榨取SCP的传输速度,有了这个基础,就可以进一步的使用压缩来加速传输速度了。只使用scp,传输速率最快约90MB,本文通过压缩将把最快传输速率提升到约250MB/s(包括解压的过程)。

    1. 结论

    使用tar+lz4+ssh的方式能够获得最大的传输性能:

    time tar -c sendlog/|pv|lz4 -B4|ssh -c arcfour128 \ -o"MACs umac-64@openssh.com" 10.xxx.xxx.36 "lz4 -d |tar -xC /u01/backup_supu" 3.91GiB 0:00:16 [ 249MiB/s] real 0m16.067s user 0m15.553s sys 0m16.821s

    249MB/s,妥妥的。是最原始scp(40MB/s)的6倍,原来400GB传输需要约3小时,现在只需要27分钟了。

    注1:lz4在解压方面的优异表现,使得他在本案例中非常重要。如果无需解压的传输,则可以考虑使用pigz/pbiz2

    注2:使用pv观察,网络流量约80MB,所以使用nc替换ssh并不会有明显的性能提升

    注3:lz4压缩使用-B4(64KB块大小),解压使用-B7(4MB块大小),是本案例的测试最优值 (more…)

  • 加速scp传输速度

    ·

    当需要在机器之间传输400GB文件的时候,你就会非常在意传输的速度了。默认情况下(约125MB带宽,网络延迟17ms,Intel E5-2430,本文后续讨论默认是指该环境),scp的速度约为40MB,传输400GB则需要170分钟,约3小时,如果可以加速,则可以大大节约工程师的时间,让攻城师们有更多时间去看个电影,陪陪家人

    1. 结论:使用如下命令可以让scp速度提升50~150%

    scp -r -c arcfour128 ...
    scp -r -c aes192-cbc ...
    scp -r -c arcfour128 -o "MACs umac-64@openssh.com" ...

    原因概述:

    • 通常,更弱的加密算法,scp传输速度更快。这里的测试看到加密算法-c arcfour128-c aes192-cbc可以大大加速scp传输
    • 用于完整性校验的MAC( message authentication code)算法,对性能约有10%-20%的影响。这里的测试看到-o "MACs umac-64@openssh.com"是不错的选择。
    • 这里测试看到,scp内置的传输压缩并没有什么效果。事实上,合理的使用压缩工具是可以进一步降低传输时间的,具体的参考:使用tar+lz4/pigz+ssh更快的数据传输。你可以通过参数-o "Compression yes"来启用压缩来观察实际案例中的情况。

    声明:测试与数据本身特性有很大关系,本文使用InnoDB的redo log作为测试数据。

    2. 测试数据:加密算法和压缩的影响

    这里对比了12种ssh中实现的加密算法和是否使用压缩的传输效率,测试文件使用的是InnoDB的1GB*4的日志文件(注意:不同类型的文件测试结果会很不同),这里纵坐标单位为MB/s,数据分为压缩传输和不压缩传输两组:

    screen-scp-compare-cipher-compression

    原始数据:scp_speed.txt

    (more…)