一、问题背景

在使用麒麟操作系统的时候,我们常常会去调整一些系统参数,来让系统运行得更符合我们的要求。其中,vm.swappiness 这个参数就很关键,它主要用来控制系统把内存数据交换到交换空间(也就是 swap 分区)的倾向程度。这个参数值的范围是从 0 到 100,数值越大,系统就越倾向于把内存里的数据交换到 swap 分区;数值越小,系统就越倾向于保留内存里的数据,减少和 swap 分区之间的数据交换。

有时候,我们调整了 vm.swappiness 参数之后,却发现系统的响应变慢了。这就很让人头疼,因为我们原本是想让系统运行得更好,结果却适得其反。这时候,我们就需要通过结合 swap 分区利用率和内存压力进行反向测试,来找出系统响应变慢的原因。

二、相关概念介绍

2.1 vm.swappiness 参数

vm.swappiness 是 Linux 内核里的一个参数,在麒麟操作系统这类基于 Linux 内核的系统里也存在。它的取值范围是 0 - 100,我们可以通过以下命令来查看当前系统的 vm.swappiness 参数值:

cat /proc/sys/vm/swappiness

输出结果会是一个 0 到 100 之间的整数。比如,如果输出是 60,那就表示系统有一定的倾向把内存数据交换到 swap 分区。我们也可以通过以下命令临时修改这个参数值:

sysctl vm.swappiness=20

这里把 vm.swappiness 的值临时改成了 20,意味着系统会更倾向于保留内存里的数据。不过,这种修改在系统重启后就会失效。如果要永久修改,可以编辑 /etc/sysctl.conf 文件,在文件里添加或修改这一行:

vm.swappiness = 20

然后执行以下命令让修改生效:

sysctl -p

2.2 swap 分区

swap 分区就像是系统的一个备用内存。当系统的物理内存不够用的时候,就会把一些暂时不用的内存数据存到 swap 分区里,等需要用这些数据的时候,再从 swap 分区把数据读回到物理内存。我们可以通过以下命令查看系统的 swap 分区使用情况:

swapon -s

这个命令会输出 swap 分区的相关信息,包括分区的设备名、大小、已使用的空间等。例如:

Filename				Type		Size	Used	Priority
/dev/sda2                               partition	2097148	0	-1

这里显示 /dev/sda2 是 swap 分区,大小是 2097148KB,当前使用量是 0KB。

2.3 内存压力

内存压力就是指系统在使用内存过程中面临的紧张程度。当系统的物理内存快被用完,而又有新的程序需要使用内存的时候,就会产生内存压力。我们可以通过 free 命令来查看系统的内存使用情况,从而了解内存压力:

free -m

输出结果会显示内存的总量、已使用的量、空闲的量等信息,单位是 MB。例如:

              total        used        free      shared  buff/cache   available
Mem:          7972        3622        3041         137        1308        3803
Swap:         2047           0        2047

这里可以看到,系统的物理内存总量是 7972MB,已使用 3622MB,空闲 3041MB;swap 分区总量是 2047MB,当前使用量为 0MB。

三、反向测试步骤

3.1 记录初始状态

在进行反向测试之前,我们要先记录下系统的初始状态,包括 vm.swappiness 参数值、swap 分区利用率和内存压力情况。

查看并记录 vm.swappiness 参数值

cat /proc/sys/vm/swappiness
# 假设输出结果是 60,记录下这个值

查看并记录 swap 分区利用率

swapon -s
# 记录下 swap 分区的使用情况,比如上面示例里用到的
# Filename				Type		Size	Used	Priority
# /dev/sda2                              partition	2097148	0	-1

查看并记录内存压力情况

free -m
# 记录下内存的使用情况,如下
#               total        used        free      shared  buff/cache   available
# Mem:          7972        3622        3041         137        1308        3803
# Swap:         2047           0        2047

3.2 调整 vm.swappiness 参数

接下来,我们调整 vm.swappiness 参数,尝试不同的值,看看系统的响应会有什么变化。例如,我们可以把 vm.swappiness 参数值从 60 降低到 20:

sysctl vm.swappiness=20

3.3 监控系统性能

在调整参数之后,我们要对系统的性能进行监控,主要关注系统响应速度、swap 分区利用率和内存压力的变化。

监控系统响应速度

可以使用一些简单的系统操作来感受系统响应速度,比如打开文件、运行程序等。如果有条件,也可以使用性能监控工具,如 top 命令,实时查看系统的负载情况和进程运行情况:

top

top 界面中,我们可以看到系统的负载平均值、CPU 使用率、内存使用情况等信息。按 q 键可以退出 top 界面。

监控 swap 分区利用率

定时查看 swapon -s 命令的输出,记录 swap 分区的使用变化情况:

# 每隔一段时间运行一次以下命令并记录结果
swapon -s

监控内存压力

同样,定时使用 free -m 命令查看内存使用情况,记录内存压力的变化:

# 每隔一段时间运行一次以下命令并记录结果
free -m

3.4 多次调整参数并测试

我们可以多次调整 vm.swappiness 参数,尝试不同的值,如 10、30、40 等,每次调整后都按照上述步骤进行系统性能监控。通过多次测试,我们可以得到不同参数值下系统的性能表现。

3.5 分析测试结果

根据记录的测试数据,分析 vm.swappiness 参数值、swap 分区利用率、内存压力和系统响应速度之间的关系。例如,如果发现当 vm.swappiness 参数值降低时,swap 分区利用率下降,但系统响应速度还是变慢,那就需要进一步分析是内存压力过大,还是其他原因导致的。

四、应用场景

4.1 服务器场景

在服务器场景下,服务器可能同时运行多个服务和应用程序,对内存的需求比较大。如果 vm.swappiness 参数设置不合理,可能会导致系统频繁进行内存和 swap 分区之间的数据交换,从而降低系统的响应速度。通过反向测试,可以找到一个合适的 vm.swappiness 参数值,让服务器既能充分利用物理内存,又能避免过度使用 swap 分区,保证服务器的稳定运行。

4.2 开发环境场景

在开发环境中,开发者可能会同时打开多个开发工具和测试程序,也容易出现内存紧张的情况。通过调整 vm.swappiness 参数并进行反向测试,可以优化开发环境的性能,提高开发效率。

五、技术优缺点

5.1 优点

  • 优化系统性能:通过反向测试,我们可以找到最适合系统的 vm.swappiness 参数值,减少系统与 swap 分区之间不必要的数据交换,提高系统的响应速度和整体性能。
  • 深入了解系统:在测试过程中,我们可以全面了解系统的内存使用情况、swap 分区的工作原理和系统对内存压力的处理机制,有助于我们更好地管理和优化系统。

5.2 缺点

  • 测试时间长:反向测试需要多次调整参数并进行长时间的性能监控,比较耗时,尤其是在服务器这样不能随意停机的环境中,测试会受到一定的限制。
  • 结果复杂性:系统性能受到多种因素的影响,除了 vm.swappiness 参数,还包括硬件配置、应用程序的特点等。所以,测试结果可能比较复杂,分析起来有一定的难度。

六、注意事项

6.1 备份重要数据

在进行反向测试之前,一定要备份好系统中的重要数据。虽然调整 vm.swappiness 参数一般不会直接导致数据丢失,但在测试过程中,如果出现系统崩溃等意外情况,可能会造成数据损失。

6.2 逐步调整参数

在调整 vm.swappiness 参数时,要逐步进行,每次只调整一个较小的幅度。这样可以更准确地观察系统性能的变化,避免因为参数调整过大而导致系统出现严重问题。

6.3 结合实际情况分析结果

在分析测试结果时,要结合系统的实际使用情况和业务需求。不同的应用场景对系统性能的要求可能不同,所以不能仅仅根据测试数据就盲目确定 vm.swappiness 参数值,要综合考虑各种因素。

七、文章总结

通过对麒麟操作系统下调整 vm.swappiness 参数后系统响应变慢这一问题进行反向测试,我们可以深入了解系统的内存使用情况和性能表现。在测试过程中,我们记录了系统的初始状态,多次调整 vm.swappiness 参数,监控了系统的响应速度、swap 分区利用率和内存压力的变化,并根据测试结果进行了分析。

反向测试虽然有一定的缺点,如测试时间长、结果分析复杂等,但它能帮助我们找到适合系统的 vm.swappiness 参数值,优化系统性能。在实际操作中,我们要注意备份重要数据、逐步调整参数,并结合实际情况分析结果。