在数字时代,计算机性能的提升似乎永无止境,但并非每个人都能跟上硬件更新的步伐。对于许多用户来说,如何在有限的预算内让现有的Linux系统运行得更快、更流畅,成为了一个亟待解决的问题。本文将分享简单实用的Linux系统优化技巧,不仅能够显著提高系统的响应速度,还能延长旧设备的使用寿命,让你的老旧电脑重获新生。无论你是Linux新手还是有一定经验的用户,这些技巧都将帮助你更好地掌握自己的系统,享受更加高效、愉悦的使用体验。让我们一起探索,如何用最小的成本实现最大的性能提升吧!
优化导读
性能优化是个系统工程,总是牵一发而动全身,它涉及了从程序设计、编程语言,再到系统、存储、网络等各种底层基础设施的方方面面。每一个组件都有可能出问题,而且很有可能多个组件同时出问题。
讲解 Linux 性能的基本指标、工具,以及相应的观测、分析和调优方法。包括 CPU 性能、磁盘 I/O 性能、内存性能以及网络性能。
系统性能问题,只要你理解了应用程序和系统的少数几个基本原理,再进行大量的实战练习,建立起整体性能的全局观。
性能指标:“高并发”和“响应快”是从应用负载的视角来考察性能,直接影响了产品终端的用户体验。也正对应着性能优化的两个核心指标——“吞吐”和“延时”。
随着应用负载的增加,系统资源的使用也会升高,甚至达到极限。而性能问题的本质,就是系统资源已经达到瓶颈,但请求的处理却还不够快,无法支撑更多的请求。性能分析,其实就是找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更高效地利用系统资源处理更多的请求。
性能分析六个步骤:
(1)选择指标评估应用程序和系统的性能;
(2)为应用程序和系统设置性能目标;
(3)进行性能基准测试;
(4)性能分析定位瓶颈;
(5)优化系统和应用程序;
(6)性能监控和告警。
网络优化实操
网络性能优化的整体目标,是降低网络延迟(如 RTT)和提高吞吐量(如 BPS 和 PPS),但具体到不同应用中,每个指标的优化标准可能会不同,优先级顺序也大相径庭。
对于数据库、缓存等系统,快速完成网络收发,即低延迟,是主要的性能目标。
首先是网络接口层和网络层,它们主要负责网络包的封装、寻址、路由,以及发送和接收。每秒可处理的网络包数 PPS,就是它们最重要的性能指标(特别是在小包的情况下)。
传输层的 TCP 和 UDP,它们主要负责网络传输。对它们而言,吞吐量(BPS)、连接数以及延迟,就是最重要的性能指标。
应用层,最需要关注的是吞吐量(BPS)、每秒请求数以及延迟等指标。
从应用程序、套接字、传输层、网络层以及链路层等几个角度,分别来看网络性能优化的基本思路。
应用程序
第一种是最常用的 I/O 多路复用技术 epoll,主要用来取代 select 和 poll。这其实是解决 C10K 问题的关键,也是目前很多网络应用默认使用的机制。
第二种是使用异步 I/O(Asynchronous I/O,AIO)。AIO 允许应用程序同时发起很多 I/O 操作,而不用等待这些操作完成。等到 I/O 完成后,系统会用事件通知的方式,告诉应用程序结果。不过,AIO 的使用比较复杂,你需要小心处理很多边缘情况。
应用层的网络协议优化,也是至关重要的一点。
- 使用长连接取代短连接,可以显著降低 TCP 建立连接的成本。在每秒请求次数较多时,这样做的效果非常明显。
- 使用内存等方式,来缓存不常变化的数据,可以降低网络 I/O 次数,同时加快应用程序的响应速度。
- 使用 Protocol Buffer 等序列化的方式,压缩网络 I/O 的数据量,可以提高应用程序的吞吐。
- 使用 DNS 缓存、预取、HTTPDNS 等方式,减少 DNS 解析的延迟,也可以提升网络 I/O 的整体速度。
套接字
每个套接字,都有一个读写缓冲区。
所以,为了提高网络的吞吐量,你通常需要调整这些缓冲区的大小。比如:
- 增大每个套接字的缓冲区大小 net.core.optmem_max;
- 增大套接字接收缓冲区大小 net.core.rmem_max 和发送缓冲区大小 net.core.wmem_max;
- 增大 TCP 接收缓冲区大小 net.ipv4.tcp_rmem 和发送缓冲区大小 net.ipv4.tcp_wmem。
网络性能优化
传输层优化
TCP优化
TCP是面向可靠传输服务的。首先要掌握 TCP 协议的基本原理,比如流量控制、慢启动、拥塞避免、延迟确认以及状态流图(如下图所示)等。
- 大量time_wait状态连接,占用内存和端口资源,可以优化与time_wait状态相关的内核选项。
- 优化与SYN状态相关的内核选项,增大TCP半连接的数量或者减少SYN_RECV状态连接重传SYN+ACK包的次数。
- 长连接场景,可以缩短keepalive探测包的时间。
UDP优化
UDP是面向数据报的网络协议,不提供可靠性保障。
优化的话主要是增大套接字缓冲区、UDP缓冲区、本地端口范围、根据MTU大小调整UDP数据包,减少或者避免分片的发生。
网络层
第一种,从路由和转发的角度出发。
NAT网关服务器开启IP转发,net.ipv4.ip_forward = 1,调整数据包的生命周期TTL,开启数据包的反向地址校验。
第二种,从分片角度出发,主要是调整MTU大小(Maximum Transmission Unit)
通常,MTU 的大小应该根据以太网的标准来设置。以太网标准规定,一个网络帧最大为 1518B,那么去掉以太网头部的 18B 后,剩余的 1500 就是以太网 MTU 的大小。
比如,就以 VXLAN 为例,它在原来报文的基础上,增加了 14B 的以太网头部、 8B 的 VXLAN 头部、8B 的 UDP 头部以及 20B 的 IP 头部。换句话说,每个包比原来增大了 50B。所以,我们就需要把交换机、路由器等的 MTU,增大到 1550, 或者把 VXLAN 封包前(比如虚拟化环境中的虚拟网卡)的 MTU 减小为 1450。另外,现在很多网络设备都支持巨帧,如果是这种环境,你还可以把 MTU 调大为 9000,以提高网络吞吐量。
第三种,从 ICMP 的角度出发,为了避免 ICMP 主机探测、ICMP Flood 等各种网络问题,你可以通过内核选项,来限制 ICMP 的行为。比如,你可以禁止 ICMP 协议,即设置 net.ipv4.icmp_echo_ignore_all = 1。这样,外部主机就无法通过 ICMP 来探测主机。或者,你还可以禁止广播 ICMP,即设置 net.ipv4.icmp_echo_ignore_broadcasts = 1。
SSH优化
/etc/ssh/sshd_config文件中修改GSSAPIAuthentication no、UseDNS no,然后重启sshd服务即可。