发布于: Oct 30, 2022

     

2019 年 3 4 日,Linus Torvalds linux-kernel 邮件列表宣布了 Linux 5.0 版本内核的正式发布。

尽管尽管 Linus 戏称如果你想有正式的理由,那就是我的手指和脚趾都用完了,所以 4.21 变成了 5.0”,但事实上 Linux 5.0 版本内核还是具有许多新功能,包括了备受期待的 Wireguard 的集成; Y2038 问题所作的准备; cgroupv2 中添加了对 cpuset 资源控制器的支持; 增加了对 btrfs 中交换文件的支持等等。尽管今天主流的 Linux  分发版本中 Kernel 的版本大多维持在 4.14- 4.19 这些版本之间,我们正在使用的这个 Ubuntu 18.04 缺省的 Linux Kernel 版本就是 4.15,但从过去一年多的反馈来说 Linux kernerl 5.x 可以称得上是发展飞速的版本了。从我使用的体验来看,算得上是个稳定的版本。至于名为“Focal Fossa” Ubuntu LTS 下一代版本(20.04)缺省的 kernel 版本就将是 5.3。这个月底,我们就可以体验到这个新的变化了。

Ubuntu 18.04 Kernel 升级到 5.x 是一件简单不过的事情。并不需要我们手工编译 Kernel,而只是简单的安装一个名为 Ubuntu LTS enablement (也称作 HWE 或者 Hardware Enablement) 下的 linux-generic-hwe-18.04 包即可。安装的脚本如下

#!/bin/bash

lsb_release -a
uname -a
export DEBIAN_FRONTEND=noninteractive
sudo apt update
sudo apt install -y linux-aws-edge#sudo apt-get -o Dpkg::Options::="--force-confold" install --install-recommends linux-generic-hwe-18.04 -q -y --allow#sudo apt-get autoremove
echo "Please reboot system."
echo "Done."

安装之后需要重新启动。这时,当我们输入这条命令就可以看到当前 Kernel 的版本

$ uname -r
5.3.0-47.39

Amazon Systems Manager 代理(SSM agent)是一个 Amazon 软件,可以在 Amazon EC2 实例、本地服务器或虚拟机 (VM) 上安装和配置。SSM 代理 让 Systems Manager 可以更新、管理和配置这些资源。代理处理来自 Amazon Web Services 云中的 Systems Manager 服务的请求,然后按照请求中指定的方式运行它们。SSM 代理之后使用 Amazon Message Delivery Service 将状态和执行信息发送回 Systems Manager 服务。这样,我们就可以通过 Systems Manager 服务来对 EC2 实例进行有效的管理。

如果我们需要 System Manager 的功能,并且 SSM agent 没有为我们安装的情况下,我们就需要通过这个脚本完成安装

#!/bin/bash
set-e

sudo apt update
sudo apt-get install -y snap
#check agent status
sudo snap list amazon-ssm-agent
#start agent
sudo systemctl start snap.amazon-ssm-agent.amazon-ssm-agent.service
sudo systemctl enable snap.amazon-ssm-agent.amazon-ssm-agent.service

echo "Done."

如果你与我一样患有软件版本的洁癖,总是要将软件升级到最新版本。那么这个技巧绝对是治病的良药。方法的关键是安装配置了一款名为 unattended-upgrades 的软件包。它的作用是自动安装更新的包,并可配置为更新所有包或只安装安全更新。安装配置的方法如下

#!/bin/bash
set -e

sudo apt update
sudo apt-get install -y unattended-upgrades
#upgrade all updates
sudo sed -i 's|//      "${distro_id}:${distro_codename}-updates";|      "${distro_id}:${distro_codename}-updates";|' /etc/apt/apt.conf.d/50unattended-upgrades|#autoremove unused kernel
sudo sed -i 's|//Unattended-Upgrade::Remove-Unused-Kernel-Packages "false";|Unattended-Upgrade::Remove-Unused-Dependencies "false";|' /etc/apt/apt.conf.d/50unattended-upgrades#auto remove unused dependencies
sudo sed -i 's|//Unattended-Upgrade::Remove-Unused-Dependencies "false";|Unattended-Upgrade::Remove-Unused-Dependencies "false";|' /etc/apt/apt.conf.d/50unattended-upgrades
#enable autoreboot
sudo sed -i 's|//Unattended-Upgrade::Automatic-Reboot "false";|Unattended-Upgrade::Automatic-Reboot "true";|' /etc/apt/apt.conf.d/50unattended-upgrades#autoreboot at 2:00am
sudo sed -i 's|//Unattended-Upgrade::Automatic-Reboot-Time "02:00";|Unattended-Upgrade::Automatic-Reboot-Time "02:00";|' /etc/apt/apt.conf.d/50unattended-upgrades

sudo tee -a /etc/apt/apt.conf.d/20auto-upgrades >/dev/null << EOT
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
EOT

echo "Done."

在这个脚本当中,我的设置是自动完成全部的升级,自动删除不使用的 kernel,自动删除不使用的依赖项,允许自动重新启动,自动启动的时间设定为凌晨 2 点等等。

如果你有不同的需要,可以在此之上作出适当的修改即可。

P3 作为 GPU 实例很多时候被用于使用各种深度学习的框架来训练模型。对于模型过大的情况,就需要利用多个 EC2 实例来进行分布式的模型训练。在分布式计算的术语中,这些实例通常被称为节点(node),这些节点的集合就是集群。为了实现分布式训练,除了节点的资源以外,还需要解决网络通讯的问题。我们还必须了解另一个术语消息传递接口(MPI)。MPI 是一个开放标准,它定义了一系列关于节点互相通信的规则,MPI 也是一个编程模型 /API

缺省的 Ubuntu 的设置并不会考虑到上述的这些场景,于是我们就必须要针对 MPI 网络通讯以及 P3 实例的系统性能作必要的优化。我的优化设置是这样的

#!/bin/bash
#network optimization

sudo tee -a /etc/sysctl.conf << 'EOF'
#Performance settings
#Increasing the size of the TCP receive queue
net.core.netdev_max_backlog = 100000
net.core.netdev_budget = 50000
net.core.netdev_budget_usecs = 5000
#Increase the maximum connections
net.core.somaxconn = 1024
#Increase the memory dedicated to the network interfaces
net.core.rmem_default = 1048576
net.core.rmem_max = 16777216
net.core.wmem_default = 1048576
net.core.wmem_max = 16777216
net.core.optmem_max = 65536
net.ipv4.tcp_rmem = 4096 1048576 2097152
net.ipv4.tcp_wmem = 4096 65536 16777216
#Increase UDP limits, default is 4096
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
#Enable TCP Fast Open
net.ipv4.tcp_fastopen = 3#Tweak the pending connection handling
net.ipv4.tcp_max_syn_backlog = 30000
net.ipv4.tcp_max_tw_buckets = 2000000

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_slow_start_after_idle = 0
#Change TCP keepalive parameters
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 6
#Enable MTU probing
net.ipv4.tcp_mtu_probing = 1
#TCP timestamps
net.ipv4.tcp_timestamps = 0
#Enable BBR
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
#TCP SYN cookie protection
net.ipv4.tcp_syncookies = 1
#TCP rfc1337
net.ipv4.tcp_rfc1337 = 1
#Reverse path filtering
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1#Log martian packets
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1
#Disable ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
#Ignore ICMP echo requests
net.ipv4.icmp_echo_ignore_all = 1
net.ipv6.icmp.echo_ignore_all = 1
#Virtual memory, default is 20,10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
#Decreasing the VFS cache parameter value,default is 100
vm.vfs_cache_pressure = 50
#change Swappiness,default is 60. cat /proc/sys/vm/swappiness
vm.swappiness = 10
EOF

sudo sysctl -p
echo "Done."

如果我们顺利的完成了全部的优化,相信我们的这台实例的潜力已经被成功的挖掘出来。这些方法不仅适用于 P3 实例,对于大多数的 EC2 实例都具有参考作用。需要强调的一点,关于时钟源的优化方法仅限于基于 Xen Hypervisor  的实例,不适用于基于 Nitro 的新类型的实例。至于 Nitro 实例的优化方法,也许要等到本系列结束之后我们再来探讨。

相关文章