公司入职发了台 16G 内存的惠普笔记本,买了 Mac 之后一直闲置,在拖延许久之后终于抽时间将其换成 CentOS,来搞一些自己的服务放上面,毕竟 16G 内存还是很可观的配置。本篇讲述折腾过程。
安装 CentOS
安装过程就不多说了,需要注意的就是关闭安全启动,启用传统模式(事实上启用之后是 UEFI 和传统模式混用,这种情况下 CentOS 会自动以 UEFI 模式进行安装)。这里有一个坑点在于如果在安装过程中选择无线连接,在安装完之后该连接无法启用。因为选择了最小化安装,网络管理相关的依赖是残缺的,所以需要在安装之后手动修复。
命令行模式下的网络连接
首先查看网络设备:
1 | [root@localhost ~]# nmcli dev status |
证明无线网卡没有被管理,需要将其纳入网络管理。
安装 NetworkManager-wifi
包重启即可,由于在安装过程中连接过无线网,那么在 /etc/sysconfig/network-scripts
目录下可以看到 ifcfg-[SSID]
的配置文件,那么重启之后会用该文件连接 wifi 网络。
没有网络怎么安装依赖包呢?挂安装光盘起本地镜像就好,在 /etc/yum.repos.d/CentOS-Media.repo
中指定了本地镜像源的挂载位置,挂在到相应位置启用即可。
设置公网访问
电信提供公网 IP,在路由器中将该电脑设备设置为 DMZ 区设备即可利用公网 IP 访问,需要注意的是启用 DHCP 的话内网 IP 可能变化,要在路由器配置中将特定的固定 IP 地址与设备 MAC 进行绑定,如此便确保 DMZ 区的设备始终为该电脑设备。
休眠问题
笔记本电脑合盖之后会自动休眠,需要进行配置,使其在合盖操作时依然保持运行状态。
编辑 /etc/systemd/logind.conf
文件,找到如下部分:
1 | [Login] |
这里对该文件有详细的描述:https://www.freedesktop.org/software/systemd/man/logind.conf.html
到这里应该已经 OK 了,但是合上盖子后发现,即使通过局域网内进行 ssh 连接操作,都异常卡顿,网络连接非常慢。然而确实是可以连接上去的,服务器并没有休眠。这就让我开始怀疑除了上述控制休眠的设定之外,还有其他配置,猜测是由于电源管理的问题引起的。
由电源管理着手,搜寻资料,找到了一份《Red Hat Enterprise Linux 7 电源管理指南》。在其中发现了管理无线设备的工具,RFKill。此处引用原文介绍:
很多计算机系统包含无线电传输,其中包括 Wi-Fi、蓝牙和 3G 设备。这些设备消耗电源,在不使用这些设备时是一种浪费。
RFKill 是 Linux kernel 中的一个子系统,它可提供一个界面,在此界面中可查询、激活并取消激活计算机系统中的无线电传输。当取消激活传输时,可使其处于可被软件重新激活的状态(即“软锁定”)或者将其放在软件无法重新激活的位置(即“硬锁定”)。
刚开始以为这就是原因,后来才发现该软件包和 BIOS 设定中的启用硬件设备一样,都是为了在电脑运行时停止启用某些设备。
1 | [root@localhost yum.repos.d]# rfkill list |
要么启用,要么禁用。这跟合上盖子启用网卡节能的现象不太相符。后来同样在该手册中,我发现了ASPM(Active-State Power Management,活动状态电源管理)。
ASPM(Active-State Power Management,活动状态电源管理)能节省 PCI Express(PCIe,Peripheral Component Interconnect Express)子系统的电量,其原理为当 PCIe 连接没有处于使用状态时将其设定为低功率状态。ASPM 可以同时控制连接两端的电源状态,并且在连接终端的设备处于满电状态的情况下,仍然可以节电。
看描述和我遇到的问题比较相符,在如下文件中可以看到 ASPM 的策略配置。
1 | [root@localhost yum.repos.d]# cat /sys/module/pcie_aspm/parameters/policy |
在默认情况下,ASPM 是默认状态(default),即根据固件设置设定 PCIe 连接的状态。在上述文件中去直接更改设置是不可以的,修改的话系统会报写保护,手册中提到可以在启动时作为内核参数配置,参考 《在 CentOS 7 上设置 grub2》尝试之:
1 | [root@localhost yum.repos.d]# cat /etc/default/grub |
核心参数就是 pcie_aspm=off
。重启之后测试,立竿见影,当我觉得问题解决的时候。过了一个小时,又歇菜了,又开始陷入了卡顿。
这时考虑,可能默认的固件设置还是会生效,只是相比较系统的设置而言没那么严格,遂决定尝试更改策略,而不是完全禁用。将 GRUB 配置中改为:
1 | GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet pcie_aspm.policy=performance" |
一切运行 OK,只能说服务器发行版运行于个人 PC 时,还是有或多或少的水土不服的。
2 小时后的更新
本以为一切 OK 的时候,又出现了该问题,看来还是没有找到问题的根源。随后又将视线转向TUNED 和 TUNED-ADM。
tuned 是一项配置文件调整机制,使 Red Hat Enterprise Linux 适应特定负载特性,例如 CPU 密集型任务要求,或存储/网络吞吐量的响应能力。
伴随它的工具 ktune 结合了 tuned-adm 工具,提供大量预先配置的调整分析,以便在大量具体使用案例中提高性能并降低能耗。编辑这些配置或者创建新配置可生成为系统定制的性能解决方案。
系统内预设了一些 profile,通过这些 profile 可以快速选择性能的优化方案,查看 profile 列表:
1 | [root@localhost ~]# tuned-adm list |
在官网提供的配置列表中还有一项名为 sap 的配置,不得不感叹果真第一 ERP 系统,连红帽都为其做单独的优化配置。
默认启用的是 balanced,在能耗和性能之间尽可能达到最佳平衡,猜测可能对网络进行限制,于是我将其改为 throughput-performance
,这将关闭节点并提高网络吞吐能力。更改之后需要重启 tuned 服务:
1 | systemctl restart tuned |
最好重启系统以使其运行在更改之后的配置下,重启之后验证,还是不行,遂决定禁用 tuned 服务再次验证。
禁用 tuned 服务执行如下命令:
1 | tuned-adm off |
并直接禁用 tuned 进程:
1 | systemctl stop tuned |
重启之后验证,问题仍旧出现,让我想放弃用无线连接方式,买根网线改用有线方式了。不过由此过程找到的文档:《虚拟化调试和优化指南》 值得阅读。
回头看网络管理
既然 Linux 本身通过 NetworkManager 来管理网络服务,在开头也是安装了 NetworkManager-wifi
包才能使用无线网络,那么有可能在网络管理这边就有相应的配置。在 windows 系统中同样在网卡设置中有相应的节能配置,因此查找资料,发现一个配置项。
NetworkManager supports WiFi powersaving but the function is rather undocumented.
From the source code: wifi.powersave can have the following value:
NM_SETTING_WIRELESS_POWERSAVE_DEFAULT (0): use the default value
NM_SETTING_WIRELESS_POWERSAVE_IGNORE (1): don’t touch existing setting
NM_SETTING_WIRELESS_POWERSAVE_DISABLE (2): disable powersave
NM_SETTING_WIRELESS_POWERSAVE_ENABLE (3): enable powersave
在 /etc/NetworkManager/conf.d
目录下新建文件 wifi-powersave-off.conf
:
1 | [connection] |
将其关闭,重启网络服务,再次验证:
1 | systemctl restart NetworkManager |
配置免密登录
事实上 CentOS 7.4 之后,使用了 ssh 2.0 版本的协议,无需手动配置 sshd_config 来启用免密登录,默认是启用的。如果像之前那样配置 RSAAuthentication yes
选项,会在 /var/log/secure
记录中看到如下提示:
1 | Nov 17 14:47:06 localhost sshd[11773]: reprocess config line 43: Deprecated option RSAAuthentication |
此次设置公钥之后,仍然无法登录,搜索资料有说是 SELinux 引起的,关闭 SELinux 仍然无法免密登录。查找许久后发现是我本地的 ssh 连接配置出现了问题。
1 | Host 192.168.1.* |
我的局域网连接恰好和该 ip 段重复,所以一直使用错误的密钥文件进行连接。
添加了一条特殊的 ip 配置之后,问题解决,由此也说明 ssh 的 config 文件配置具体 ip 的优先级要高于表达式匹配,无所谓配置在文件中的先后顺序。
至此,便可以快乐的玩耍这台小鸡了。
参考
- RedHat Linux 7 性能调优指南
- 《虚拟化调试和优化指南》
- 《Red Hat Enterprise Linux 7 电源管理指南》
- 《在 CentOS 7 上设置 grub2》
- How to turn off Wireless power management permanently
-EOF-