当前位置: 首页 > news >正文

Linux缓存调优指南:提升服务器性能的关键策略

在深入探讨 Linux 缓存调优之前,我们先来搞清楚缓存到底是什么。简单来说,缓存是一种高速存储机制,它就像是一个数据的临时 “中转站”,把经常访问的数据存储在其中 。当程序需要读取数据时,会优先从缓存中查找,如果找到了,就可以直接使用,大大提高了数据的访问速度。

在 Linux 系统中,缓存的重要性不言而喻。它就像是服务器性能的 “加速器”,能显著提升服务器的响应速度和整体性能。我们知道,磁盘 I/O 操作相对较慢,而内存的读写速度则快得多。缓存的存在,就像是在慢速的磁盘和快速的 CPU 之间搭建了一座桥梁,通过将频繁访问的数据存储在内存中,减少了对磁盘的 I/O 操作,从而加快了数据的访问速度,提高了系统的整体性能 。例如,当我们的服务器需要频繁读取某个文件时,如果这个文件被缓存到内存中,下次读取时就可以直接从内存中获取,而不需要再从磁盘中读取,大大缩短了读取时间,提升了服务器的响应速度。

一、认识Linux缓存

在 Linux 系统中,缓存主要分为页缓存(Page Cache)和 inode 缓存 ,它们在系统中起着不同但又至关重要的作用。

页缓存是 Linux 缓存机制的核心,它主要缓存磁盘文件的内容 。简单来说,当我们的程序读取文件时,内核会先检查页缓存中是否有需要的数据。如果有,就直接从缓存中读取,避免了从磁盘中读取数据的开销 。比如,我们有一个 Web 服务器,它需要频繁读取一些静态资源文件,如图片、CSS、JavaScript 等。这些文件在第一次被读取后,就会被缓存到页缓存中。

当后续有其他请求需要这些文件时,就可以直接从页缓存中获取,大大提高了文件的读取速度,减少了磁盘 I/O 操作 。页缓存的工作原理基于局部性原理,即当一个数据被访问时,它附近的数据也很可能在不久的将来被访问。因此,页缓存会预读一部分数据,将其存储在缓存中,以提高后续数据访问的命中率 。

inode 缓存则主要用于缓存文件系统的元数据,比如文件名、文件权限、文件大小、文件的创建时间和修改时间等 。当我们要访问一个文件时,首先需要通过 inode 缓存找到文件的元数据,然后才能进一步读取文件的内容 。例如,当我们在命令行中输入ls命令查看目录下的文件时,系统会先在 inode 缓存中查找该目录下所有文件的元数据,然后将这些信息显示出来。

如果没有 inode 缓存,每次执行ls命令都需要从磁盘中读取这些元数据,这将大大降低系统的响应速度 。inode 缓存通过将常用的元数据存储在内存中,减少了对磁盘的访问次数,提高了文件系统的性能 。

二、缓存性能指标

在评估 Linux 缓存的性能时,有几个关键指标是我们必须要关注的,它们就像是服务器性能的 “晴雨表”,能帮助我们准确判断缓存的工作状态和性能优劣 。

缓存命中率是其中最为重要的指标之一,它是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比 。简单来说,如果缓存命中率高,就意味着大部分的数据请求都可以直接从缓存中获取数据,而不需要去访问速度较慢的磁盘,这大大提高了数据的访问效率,也就意味着缓存的利用效率高,系统性能好 。例如,一个 Web 服务器的缓存命中率如果能达到 90% 以上,那就说明它的缓存配置非常合理,大部分用户请求的数据都能快速从缓存中获取,用户体验自然就会很好 。

相反,如果缓存命中率很低,比如只有 30%,那就说明缓存没有充分发挥作用,大部分数据请求都需要去磁盘中读取,这会导致系统响应速度变慢,性能下降 。我们可以通过cachestat和cachetop等工具来查看缓存命中率 。其中,cachestat提供了整个操作系统缓存的读写命中情况,而cachetop则提供了每个进程的缓存命中情况 。

缓存大小也不容忽视,它主要由文件系统缓存和页面缓存两部分组成 。缓存大小的设置直接影响着系统的性能 。当缓存大小较小时,系统往往会频繁地从磁盘中读取数据,这会导致响应延迟增加 。而当缓存大小增加时,系统可以将更多的数据存储在内存中,从而减少对磁盘的访问次数,提高响应速度 。比如,对于一个需要频繁读取大量数据的数据库管理系统,如果缓存大小设置得足够大,就能将更多的数据库数据缓存到内存中,大大提高数据的读取速度 。

然而,缓存大小也不是越大越好,因为缓存占用了系统的内存资源,如果缓存大小设置过大,可能会导致系统内存不足,影响到其他任务的正常运行 。同时,缓存大小过大还可能会导致缓存命中率下降,因为系统可能会将更多的不常访问的数据存储在缓存中,导致热门数据的缓存命中率下降 。我们可以使用free、vmstat等命令查看系统内存和缓存的使用情况 ,也可以通过/proc/meminfo文件查看系统内存信息,其中Cached字段表示页缓存,Buffers字段表示缓冲区 。

缓存更新频率同样关键,它决定了缓存中的数据与磁盘中数据的一致性程度 。如果缓存更新频率过低,可能会导致缓存中的数据过时,应用程序读取到的数据不是最新的 。例如,对于一个实时更新的新闻网站,如果缓存更新频率过低,用户可能会看到旧的新闻内容 。而如果缓存更新频率过高,虽然能保证数据的实时性,但会增加系统的开销,因为每次更新缓存都需要进行数据的读取和写入操作 。

对于更新频率较低的资源,如一些静态的 CSS、JavaScript 和图片文件,我们可以设置较长的缓存时间,以减少对服务器的请求;而对于更新频繁的资源,如新闻内容、股票数据等,则需要设置较短的缓存时间,确保客户端能够获取到最新的内容 。在 Linux 系统中,缓存更新频率与具体的应用场景和配置有关 ,可以通过调整相关的配置参数来控制 。

三、缓存调优工具

“工欲善其事,必先利其器” ,在进行 Linux 缓存调优时,我们需要借助一些强大的工具,它们就像是我们的 “得力助手”,能帮助我们更好地了解系统的缓存状态,从而进行有针对性的调优 。

sysctl 是一个非常重要的工具,它主要用于运行时配置内核参数,这些参数位于/proc/sys目录下 。通过 sysctl,我们可以动态地调整内核参数,而不需要重启系统,这为我们的缓存调优提供了极大的便利 。比如,我们可以使用sudo sysctl -w vm.swappiness=10命令来降低系统的交换倾向,减少不必要的磁盘 I/O 操作,提高缓存的使用效率 。

这里的vm.swappiness参数表示系统将内存数据交换到磁盘的倾向程度,取值范围是 0 - 100,默认值一般是 60 。将其设置为 10,意味着系统会尽量避免将内存数据交换到磁盘,更多地利用内存缓存,从而提高系统性能 。如果我们想要永久保留这个配置,可以修改/etc/sysctl.conf文件,在文件中添加或修改vm.swappiness = 10这一行,然后执行sudo sysctl -p命令使配置生效 。

free 命令则是用于查看系统内存使用情况的常用工具 。它可以显示系统的总内存、已使用内存、剩余内存、共享内存、缓存和缓冲区的使用情况等 。通过free -h命令,我们可以以人类可读的方式查看内存信息,非常直观 。例如,执行free -h后,可能会得到类似这样的输出:

              total        used        free      shared  buff/cache   available
Mem:           15Gi       4.0Gi       8.6Gi       100Mi       2.8Gi       11Gi
Swap:          2.0Gi          0B       2.0Gi

在这个输出中,total表示系统总物理内存的大小,这里是 15Gi;used表示当前被使用的内存大小,为 4.0Gi;free表示当前完全未被使用的内存大小,是 8.6Gi;shared表示与多个进程共享的内存大小,为 100Mi;buff/cache表示由内核用于缓存的内存,包括文件系统缓冲区和文件缓存,这里是 2.8Gi;available表示可以立即分配给新进程的内存量,为 11Gi 。从这些信息中,我们可以快速了解系统内存的使用状况,判断是否存在内存不足的情况,以及缓存和缓冲区的使用情况 。

vmstat 也是一个强大的系统性能监控工具,它可以展示给定时间间隔的服务器的状态值,包括进程、内存、虚拟内存交换情况、IO 读写情况等 。通过vmstat 1命令,我们可以每秒输出一次系统性能数据 。例如,执行vmstat 1后,可能会得到如下输出:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0      0 103388 145412 511056    0    0    18    60    1    1  2  1 96  0  0

在这个输出中,r表示运行队列中等待被运行的进程数量,b表示等待 IO 的进程数量;swpd表示虚拟内存已使用的大小,如果大于 0,表示机器物理内存不足;free表示空闲的物理内存的大小;buff表示用作缓冲的内存大小;cache表示用作缓存的内存大小;si表示每秒从磁盘读入虚拟内存的大小;so表示每秒虚拟内存写入磁盘的大小;bi表示块设备每秒接收的块数量;bo表示块设备每秒发送的块数量;in表示每秒 CPU 的中断次数,包括时间中断;cs表示每秒上下文切换次数;us表示用户 CPU 时间;sy表示系统 CPU 时间;id表示空闲 CPU 时间;wa表示等待 IO CPU 时间 。通过分析这些数据,我们可以深入了解系统的性能瓶颈,判断是否存在内存瓶颈、IO 瓶颈等问题,从而为缓存调优提供依据 。

cachestat 和 cachetop 是用于查看系统缓存命中情况的工具 。cachestat 提供了整个操作系统缓存的读写命中情况,而 cachetop 则提供了每个进程的缓存命中情况 。这两个工具都是 bcc 软件包的一部分,它们基于 Linux 内核的 eBPF(extended Berkeley Packet Filters)机制,来跟踪内核中管理的缓存,并输出缓存的使用情况 。在 Ubuntu 系统中,我们可以通过以下命令安装 bcc 软件包:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD
echo "deb https://repo.iovisor.org/apt/xenial xenial main" | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install -y bcc-tools libbcc-examples linux-headers-$(uname -r)

安装完成后,我们可以使用cachestat命令查看系统缓存的读写命中情况 。例如,执行cachestat后,可能会得到如下输出:

TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
2 0 2 1 17 279

在这个输出中,TOTAL表示总访问次数,MISSES表示缓存未命中次数,HITS表示缓存命中次数,DIRTIES表示新增到缓存中的脏页数,BUFFERS_MB表示缓冲区大小,CACHED_MB表示缓存大小 。通过这些数据,我们可以计算出缓存命中率,评估系统对缓存的利用效率 。缓存命中率的计算公式为:缓存命中率 = HITS / TOTAL * 100% 。在这个例子中,缓存命中率为2 / (2 + 0) * 100% = 100% ,说明系统的缓存利用效率非常高 。

我们可以使用cachetop命令实时监控进程的缓存读写命中情况 。例如,执行cachetop后,可能会得到如下输出:

11:58:50 Buffers MB:258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
13029 root python 1 0 0 100.0% 0.0%

在这个输出中,PID表示进程 ID,UID表示用户 ID,CMD表示进程命令,HITS表示缓存命中次数,MISSES表示缓存未命中次数,DIRTIES表示新增到缓存中的脏页数,READ_HIT%表示读缓存命中率,WRITE_HIT%表示写缓存命中率 。通过这个输出,我们可以看到每个进程的缓存命中情况,找出占用缓存较多的进程,从而有针对性地进行优化 。在这个例子中,python进程的读缓存命中率为 100.0%,写缓存命中率为 0.0%,说明该进程的读操作较多,且缓存利用效率较高,但写操作可能存在一些问题,需要进一步分析 。

四、实战调优步骤

4.1查看当前缓存状态

在进行缓存调优之前,我们首先要了解系统当前的缓存状态,就像是医生在给病人治病之前,需要先进行全面的检查一样 。通过查看缓存状态,我们可以判断系统是否需要进行调优,以及确定调优的方向和重点 。

我们可以使用free命令来查看系统内存的使用情况,包括缓存的使用情况 。例如,执行free -h命令,输出结果如下:

              total        used        free      shared  buff/cache   available
Mem:           15Gi       4.0Gi       8.6Gi       100Mi       2.8Gi       11Gi
Swap:          2.0Gi          0B       2.0Gi

从这个输出中,我们可以看到buff/cache这一列的值,它表示系统中用于缓存和缓冲区的内存大小 。通过观察这个值的变化,我们可以了解缓存的使用情况 。如果buff/cache的值较大,说明系统缓存了较多的数据,这可能会提高系统的性能 。但如果buff/cache的值过大,导致系统内存不足,影响到其他任务的正常运行,就需要考虑进行缓存调优了 。

vmstat命令也是一个非常有用的工具,它可以提供系统的详细性能信息,包括缓存的读写情况 。执行vmstat 1命令,每秒输出一次系统性能数据,输出结果如下:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0      0 103388 145412 511056    0    0    18    60    1    1  2  1 96  0  0

在这个输出中,cache列表示用作缓存的内存大小,bi列表示块设备每秒接收的块数量,bo列表示块设备每秒发送的块数量 。通过分析这些数据,我们可以了解缓存的读写性能 。如果bi和bo的值较大,说明系统对磁盘的 I/O 操作频繁,可能是缓存命中率较低,需要进一步优化缓存 。

我们还可以使用cachestat和cachetop工具来查看缓存命中率 。cachestat提供了整个操作系统缓存的读写命中情况,cachetop则提供了每个进程的缓存命中情况 。例如,执行cachestat命令,输出结果如下:

TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
2 0 2 1 17 279

从这个输出中,我们可以看到TOTAL表示总访问次数,MISSES表示缓存未命中次数,HITS表示缓存命中次数 。通过计算HITS / TOTAL * 100%,我们可以得到缓存命中率 。在这个例子中,缓存命中率为2 / (2 + 0) * 100% = 100% ,说明系统的缓存利用效率非常高 。如果缓存命中率较低,比如低于 80%,就需要考虑优化缓存,提高命中率 。

4.2调整内核参数

在了解了系统当前的缓存状态后,我们就可以根据实际情况调整内核参数,对缓存进行优化 。内核参数就像是系统的 “幕后指挥官”,它们控制着系统的各种行为,包括缓存的管理和使用 。通过调整这些参数,我们可以让系统更好地适应不同的应用场景,提高缓存的性能 。

vm.swappiness是一个非常重要的内核参数,它表示系统将内存数据交换到磁盘的倾向程度,取值范围是 0 - 100,默认值一般是 60 。当系统内存不足时,内核会根据vm.swappiness的值来决定是否将内存中的数据交换到磁盘的交换空间(Swap)中 。如果vm.swappiness的值设置得较高,比如 80,那么系统在内存不足时会更倾向于将内存数据交换到磁盘,这虽然可以暂时解决内存不足的问题,但会增加磁盘 I/O 操作,降低系统性能 。因为磁盘的读写速度远远低于内存,频繁的磁盘 I/O 操作会导致系统响应变慢 。

相反,如果 vm.swappiness 的值设置得较低,比如 10,系统会尽量避免将内存数据交换到磁盘,更多地利用内存缓存,从而提高系统性能 。对于大多数服务器应用来说,建议将vm.swappiness的值设置在 10 - 30 之间 。我们可以使用sudo sysctl -w vm.swappiness=10命令来临时调整vm.swappiness的值,也可以通过修改/etc/sysctl.conf文件,添加或修改vm.swappiness = 10这一行,然后执行 sudo sysctl -p 命令使配置永久生效 。

vm.dirty_ratio和vm.dirty_background_ratio这两个参数则与脏页的处理有关 。脏页是指已经被修改但还没有被写入磁盘的内存页 。vm.dirty_ratio表示当脏页占内存的比例达到这个值时,系统会开始同步脏页到磁盘 ,默认值一般是 20 。vm.dirty_background_ratio表示当脏页占内存的比例达到这个值时,系统会在后台开始同步脏页到磁盘 ,默认值一般是 10 。如果vm.dirty_ratio设置得过高,脏页在内存中积累的时间会变长,这可能会导致系统在同步脏页时出现长时间的 I/O 阻塞,影响系统性能 。

而如果vm.dirty_background_ratio设置得过低,系统会频繁地在后台同步脏页,增加磁盘 I/O 负载 。为了平衡系统性能和 I/O 负载,建议将vm.dirty_ratio设置在 5 - 10 之间,将vm.dirty_background_ratio设置在 1 - 5 之间 。同样,我们可以使用sudo sysctl -w vm.dirty_ratio=5和sudo sysctl -w vm.dirty_background_ratio=1命令来临时调整这两个参数的值,也可以通过修改/etc/sysctl.conf文件使配置永久生效 。

4.3清理缓存

在某些情况下,我们可能需要手动清理缓存,以释放内存资源,提高系统性能 。比如,当系统内存不足,而缓存中又占用了大量内存时,清理缓存可以让系统有更多的内存用于其他任务 。

在 Linux 系统中,我们可以通过/proc/sys/vm/drop_caches这个接口来清理缓存 。具体来说,有以下三种清理方式:

  • 仅释放页缓存(PageCache):执行echo 1 > /proc/sys/vm/drop_caches命令,或者sudo sysctl -w vm.drop_caches=1命令 。页缓存主要用于缓存磁盘数据,清理页缓存可以释放用于缓存磁盘数据的内存 。

  • 释放目录项(Dentries)和索引节点(Inodes)缓存:执行echo 2 > /proc/sys/vm/drop_caches命令,或者sudo sysctl -w vm.drop_caches=2命令 。目录项缓存用于缓存目录结构,索引节点缓存用于缓存文件元数据,清理这两个缓存可以释放用于缓存文件系统元数据的内存 。

  • 释放所有缓存(PageCache + Dentries + Inodes):执行echo 3 > /proc/sys/vm/drop_caches命令,或者sudo sysctl -w vm.drop_caches=3命令 。这将释放所有类型的缓存,最大限度地释放内存 。

需要注意的是,在清理缓存之前,建议先执行sync命令 。sync命令的作用是将所有缓存数据同步到磁盘,避免因清理缓存导致的数据丢失 。因为在清理缓存时,如果有未同步的脏页,这些数据可能会丢失 。例如,我们可以执行sync && echo 3 > /proc/sys/vm/drop_caches命令,先同步数据,再清理所有缓存 。

清理缓存虽然可以释放内存资源,但也可能会对系统性能产生一定的影响 。因为清理缓存后,系统在后续访问数据时,可能需要重新从磁盘读取数据,这会增加磁盘 I/O 操作,导致系统响应速度变慢 。所以,在清理缓存时,我们需要谨慎操作,根据实际情况选择合适的清理方式和时机 。一般来说,只有在系统内存严重不足,或者需要强制刷新缓存时,才建议清理缓存 。

4.4优化应用程序

除了调整内核参数和清理缓存外,从应用程序层面进行优化也是提高系统性能的关键 。应用程序就像是系统的 “前台演员”,它的性能直接影响着用户的体验 。通过优化应用程序,我们可以减少对缓存的不必要依赖,提高缓存的利用效率,从而提升系统的整体性能 。

从代码层面来看,我们可以优化数据访问模式,减少不必要的 I/O 操作 。比如,在读取文件时,可以采用批量读取的方式,而不是逐行读取 。假设我们有一个程序需要读取一个包含大量数据的文件,如果逐行读取,每次读取都会产生一次 I/O 操作,这会大大增加 I/O 开销 。而采用批量读取的方式,我们可以一次性读取多个数据块,减少 I/O 操作的次数 。例如,在 Python 中,我们可以使用readlines()方法一次性读取文件的所有行,而不是使用readline()方法逐行读取 。示例代码如下:

# 逐行读取
with open('large_file.txt', 'r') as f:while True:line = f.readline()if not line:break# 处理每一行数据# 批量读取
with open('large_file.txt', 'r') as f:lines = f.readlines()for line in lines:# 处理每一行数据

我们还可以缓存计算结果,避免重复计算 。比如,在计算斐波那契数列时,如果不进行缓存,每次计算都会重复计算很多中间结果,效率非常低 。而通过缓存已经计算过的结果,我们可以避免重复计算,提高计算效率 。以下是使用缓存优化后的计算斐波那契数列的代码:

# 缓存字典
fib_cache = {}
def fib(n):if n in fib_cache:return fib_cache[n]if n <= 1:result = nelse:result = fib(n - 1) + fib(n - 2)fib_cache[n] = resultreturn result

从配置层面来看,我们可以为应用程序设置合理的缓存策略 。比如,对于一个 Web 应用程序,我们可以根据不同类型的资源设置不同的缓存时间 。对于更新频率较低的静态资源,如 CSS、JavaScript 和图片文件,我们可以设置较长的缓存时间,以减少对服务器的请求 。而对于更新频繁的资源,如新闻内容、股票数据等,则需要设置较短的缓存时间,确保客户端能够获取到最新的内容 。在 Nginx 服务器中,我们可以通过配置expires指令来设置缓存时间 。例如,对于 CSS 和 JavaScript 文件,我们可以设置缓存时间为 1 周:

location ~ \.(css|js)$ {expires 1w;# 其他配置
}

对于图片文件,我们可以设置缓存时间为 1 个月:

location ~ \.(jpg|jpeg|png|gif)$ {expires 1M;# 其他配置
}

通过以上从代码层面和配置层面的优化,应用程序可以更好地利用缓存,减少对系统资源的消耗,提高系统的性能 。例如,一个经过优化的 Web 应用程序,在处理大量用户请求时,响应速度可能会提高数倍,缓存命中率也会大幅提升,从而为用户提供更加流畅的体验 。

五、Linux缓存案例分析

5.1问题描述

那天刚到公司,就接到运营同事的紧急反馈:网站打开速度变得奇慢无比,原本秒开的页面,现在加载要好几秒,用户投诉量直线上升。我心里 “咯噔” 一下,立刻登录服务器查看。

通过top命令发现,CPU 和内存使用率看起来都还算正常,并没有出现资源被占满的情况。但使用vmstat命令观察系统状态时,发现bi(从块设备读入数据到系统的块数)和bo(从系统写入数据到块设备的块数)数值异常高,磁盘 I/O 负载明显增大,这和平时稳定的状态大相径庭。

再用free -h查看内存使用情况,发现缓存(buff/cache)占用了大量内存,而且可用内存(free)所剩不多。这让我初步怀疑,问题可能出在缓存上。难道是缓存没有发挥作用,导致频繁读取磁盘数据,从而拖慢了整个系统?

5.2定位缓存 “罪魁祸首”

为了进一步确认问题,我使用cachestat工具来分析缓存的使用情况。这一查,果然发现了异常:缓存命中率低得可怜,大量的文件读取操作都没有命中缓存,直接从磁盘读取,这无疑是导致磁盘 I/O 飙升、系统性能下降的关键原因。

那为什么缓存命中率会突然变得这么低呢?我决定从应用程序入手排查。检查项目代码和配置文件后发现,最近上线的一个新功能模块,在数据处理过程中频繁地创建和删除临时文件。这些临时文件的生命周期很短,导致系统频繁地将它们加载到缓存中,又很快因为文件被删除而释放缓存空间,使得缓存无法有效利用,一直处于 “无效更新” 的状态。

此外,我还注意到服务器的内核参数vm.swappiness的值为 60(默认值)。这个参数控制着系统将内存数据交换到 swap 空间的倾向程度,数值越高,越容易将内存数据交换到 swap。由于服务器可用内存已经不多,较高的swappiness值使得系统开始频繁进行内存交换操作,进一步加剧了系统性能的恶化。

5.3多管齐下解决问题

⑴优化应用程序

针对应用程序频繁创建和删除临时文件的问题,我们对代码进行了重构。将一些不必要的临时文件操作进行合并和优化,减少临时文件的创建频率。同时,在文件使用完毕后,及时关闭文件句柄,并使用unlink函数删除临时文件,避免文件被删除后,相关缓存数据仍占用内存空间。

⑵调整内核参数

为了减少内存交换操作,我将vm.swappiness的值调低至 10。通过修改/etc/sysctl.conf文件,添加或修改vm.swappiness = 10,然后执行sysctl -p使配置生效。这样,系统在内存紧张时,不会轻易将内存数据交换到 swap,而是尽量利用已有的内存资源,提高系统整体性能。

⑶清理缓存

在完成上述优化和配置调整后,为了让系统缓存快速恢复到正常状态,我决定清理部分缓存。但需要注意的是,清理缓存操作可能会对正在运行的业务产生一定影响,所以我选择在业务低峰期进行。

执行echo 3 > /proc/sys/vm/drop_caches命令,该命令会清除系统的页缓存、dentries 和 inodes 缓存。执行完命令后,再次查看缓存命中率和磁盘 I/O 情况,发现缓存命中率明显提升,磁盘 I/O 负载也逐渐恢复正常。

http://www.lqws.cn/news/603829.html

相关文章:

  • opencv基础的图像操作
  • 图像二值化方法及 Python OpenCV 实现
  • 【分明集合】特征函数、关系与运算
  • 【1.6 漫画数据库设计实战 - 从零开始设计高性能数据库】
  • 【格与代数系统】格与哈斯图
  • Instruct-GPT中强化学习(RL)训练部分详解
  • 电机控制的一些笔记
  • uniapp选择相册
  • 【读代码】百度开源大模型:ERNIE项目解析
  • web开发,旅游景点管理系统推荐算法版本demo,基于asp.net,mvc,c#,sql server
  • 【算法】动态规划 斐波那契类型: 740. 删除并获得点数
  • [面试] 手写题-防抖,节流
  • Vue 安装使用教程
  • 小白成长之路-Mysql数据库基础(二)
  • uniapp内置蓝牙打印
  • jQuery UI 安装使用教程
  • Leetcode力扣解题记录--第49题(map)
  • 电源芯片之DCDC初探索ING
  • 数据结构:递归:组合数(Combination formula)
  • 深度学习常见的激活函数
  • 2025年7月最新英雄联盟战绩自动查询工具
  • [创业之路-458]:企业经营层 - 蓝海战略 - 重构价值曲线、整合产业要素、创造新需求
  • 技术学习_人工智能_1_神经网络是如何实现的?
  • 设计模式精讲 Day 22:模板方法模式(Template Method Pattern)
  • 在 Docker 容器中使用内网穿透
  • 论文阅读:BLIPv1 2022.2
  • 使用 StatsD 向 TDengine 写入
  • Python应用指南:利用高德地图API获取公交+地铁可达圈(三)
  • 黑马python(二十三)
  • 【王阳明代数集合代数基础】文化资本理论实体意气感知评定亲疏情感偏序集,实例《临江仙》讲解情感分析之数据结构的演变