当前位置:首页>Linux>一文读懂Linux内核页缓存Page Cache

一文读懂Linux内核页缓存Page Cache

  • 2026-07-02 16:32:09
一文读懂Linux内核页缓存Page Cache

在 Linux 内核体系里,page cache 绝对是绕不开的核心基石。很多人以为掌握进程、内存管理、文件系统就算精通内核,却偏偏忽略了页缓存这一关键环节。事实上,绝大多数文件读写、磁盘 I/O 都离不开 page cache,它直接决定了系统的 I/O 效率、内存使用策略,甚至影响整体性能表现。不理解页缓存的工作机制,对内核 I/O 流程的认知就始终存在盲区。

真正吃透 Linux 内核,必须从 page cache 入手:理解它如何缓存文件数据、如何处理读写命中、脏页如何回写、内存紧张时如何回收。只有搞懂这些底层逻辑,才能看懂内存占用、分析 I/O 瓶颈,在调优与排查问题时做到心中有数。可以说,不懂页缓存,就难以真正理解 Linux 内核的设计思想,也很难称得上掌握了内核核心。

一、初识页缓存(page cache)

面试题写作模版

1.1 什么是页缓存?

在 Linux 系统的庞大体系中,页缓存(Page Cache)扮演着极为重要的角色。简单来说,页缓存是 Linux 内核用于缓存文件数据的内存区域 。我们都知道,磁盘的读写速度相较于内存来说,简直是天壤之别。磁盘的物理特性决定了它在进行数据读写时,需要花费较长的时间,比如机械硬盘的寻道时间可能达到毫秒级 ,而内存的访问速度则在纳秒级别,两者相差百万倍之多。

当进程需要读取文件时,内核并不会立刻去访问缓慢的磁盘,而是先去页缓存中查看所需的数据是否已经存在其中。如果数据恰好在页缓存里,也就是我们所说的读命中,那么就可以直接从内存中快速返回数据,这大大提高了数据读取的速度,避免了昂贵的磁盘 I/O 操作。举个例子,假如你有一个经常需要读取的配置文件,第一次读取后,它的数据就会被缓存到页缓存中,之后再次读取这个文件时,就能瞬间获取到数据,仿佛文件就直接放在内存中随时待命一样。

同样,对于写入操作,也有着巧妙的机制。通常情况下,写入的数据会先被写入页缓存,此时对应的页会被标记为 “脏页”,这就像是给数据做了一个特殊标记,表明它已经被修改且还未同步到磁盘。然后,系统会在稍后的合适时机,由内核后台线程异步地将这些脏页刷入磁盘。这样做的好处是显而易见的,它可以将多次小的写入操作合并为一次大块写入,减少了磁盘 I/O 的次数,不仅提升了磁盘的吞吐量,还能在一定程度上延长 SSD 等存储设备的使用寿命 。

页缓存是以页(Page)为基本单位进行管理的,在 Linux 系统中,一页的大小通常为 4KB 。这种以页为单位的管理方式,使得页缓存能够与虚拟内存系统深度集成,共同为系统的高效运行提供支持。同时,页缓存还实现了跨进程共享,当多个进程同时访问同一个文件时,它们可以共享页缓存中的数据,避免了重复从磁盘读取相同数据的开销。就好比多个读者都要借阅图书馆里的同一本书,只要有一个读者已经借过并将其 “缓存” 在借阅记录(类似页缓存)中,其他读者就可以直接从这个记录中获取信息,而无需再次去书架(磁盘)上取书。

1.2 页缓存的核心作用

页缓存的作用本质是“桥接内存与磁盘”,解决两者读写速度差距过大的问题(内存读写速度可达 GB/s 级别,磁盘仅为 MB/s 级别,差距近千倍),核心作用主要有 3 点,每一点都直接影响文件 IO 性能。

  1. 加速文件读取:对于那些热点文件,比如配置文件、日志文件以及数据库数据文件等,一旦被缓存到页缓存中,后续再对它们进行访问时,速度就会非常快,几乎可以达到零延迟。这就好比你把常用的工具放在伸手可及的地方,下次使用时就能迅速拿到,无需再花费时间去寻找。例如,Web 服务器在处理大量用户请求时,频繁访问的静态资源文件如果被缓存,就能快速响应请求,大大提升用户体验。
  2. 合并写操作:多次小写入操作可被合并为一次大块写入。想象一下你在写信,每次写几个字就寄出去,不仅效率低,还浪费资源;但如果把内容都写完后一次性寄出,就能节省时间和精力。在 Linux 系统中也是如此,多次小写入合并为一次大块写入,不仅提升了磁盘的吞吐量,还能减少磁盘的读写次数,从而延长 SSD 等存储设备的使用寿命。
  3. 支持 “零拷贝” 优化:像 sendfile () 系统调用,就可以直接从页缓存传输数据到网络 socket,避免了在用户态缓冲区进行数据拷贝。传统的数据传输方式,数据需要在磁盘、内核缓冲区、用户缓冲区和网络缓冲区之间多次拷贝,而 “零拷贝” 技术减少了这些不必要的拷贝过程,就像一条高速公路,让数据能够更快速、高效地传输,大大提高了数据传输的效率。Kafka 等消息队列系统就利用了这一特性,实现了高吞吐量的数据传输。

二、页缓存的工作机制

面试题写作模版

2.1 数据加载:从磁盘到页缓存

在 Linux 系统中,当我们在编写一个 C 语言程序时,使用 read 函数从文件中读取数据,就像这样:

#include <stdio.h>#include <unistd.h>intmain(){    char buffer[1024];    int fd = open("example.txt", O_RDONLY);    if (fd < 0) {        perror("open");        return 1;    }    ssize_t bytes_read = read(fd, buffer, sizeof(buffer));    if (bytes_read < 0) {        perror("read");    } else {        printf("Read %zd bytes from file.\n", bytes_read);    }    close(fd);    return 0;}

在这个程序中,read 函数的调用就是用户进程发起的读请求。当这个 read 系统调用发生时,用户态的进程会陷入内核态,将控制权交给内核。此时,内核就会接手处理这个读请求,开始在系统中寻找所需的数据。这个过程就像是你在图书馆想要借阅一本书,你向图书馆管理员(内核)提出了借阅请求,管理员开始在图书馆的各个角落(系统资源)查找你要的书。

当用户程序发起读操作(如 read 系统调用)时,文件数据并不会直接从磁盘读取到用户空间,而是必须经过页缓存这一层。内核会首先根据文件的 inode 和需要读取的数据偏移地址,在页缓存中进行查找,判断目标数据是否已经存在于内存中。若缓存未命中,说明目标数据尚未被加载到内存,此时内核必须发起真正的磁盘 I/O 请求。

内核会以 4KB 为基本单位,向磁盘驱动发送读取指令,将对应的数据块加载到内存的页缓存中。在加载完成后,内核会建立精确的映射关系,将 “文件 inode + 页内偏移” 与内存中的物理页进行绑定,方便后续快速查找。

完成映射后,内核才会将数据从页缓存复制到用户程序的缓冲区,完成整个读操作。若缓存命中,说明目标数据已经存在于页缓存中,内核可以直接从内存中获取数据并返回给用户程序,完全跳过磁盘 I/O 过程。这种方式极大提升了读取效率,也是 Linux 系统文件读写性能优越的重要原因。

在此过程中,页缓存还具备预读机制,这是一项重要的性能优化策略。预读机制的核心思想是:当程序读取文件某一部分数据时,后续极有可能继续读取相邻的数据。因此,内核不会只加载当前请求的 4KB 页,而是会提前将后续多个连续页一并加载到页缓存中。默认情况下,内核会根据文件类型和访问模式动态调整预读长度,常见预读大小为 16KB 或 32KB。通过预读,程序在后续访问时可以直接命中缓存,显著减少磁盘 I/O 次数,提高整体读取效率。

虚拟文件系统(VFS)就像是一个智能的调度员,它在接收到用户进程的读请求后,会根据文件的路径(比如 /home/user/example.txt)和偏移量(指定从文件的哪个位置开始读取数据),开始在页缓存中查找对应的页面。假设我们有一个文件系统,它的目录结构如下:

/├── home│ └── user│ ├── example.txt│ └── another_file.txt└── etc├── config1.conf└── config2.conf

当 VFS 要查找 /home/user/example.txt 这个文件的数据时,它首先会根据文件路径找到对应的索引节点(inode),inode 中包含了文件的元数据以及指向文件数据块的指针等重要信息。然后,VFS 利用这些信息,在页缓存中通过一种类似于索引查找的方式,尝试找到包含我们所需数据的页面。这个过程就像是管理员通过图书馆的索引系统(inode),在图书馆的各个书架(页缓存)上查找你要的书。如果找到了,就说明命中了;如果没找到,那就需要从磁盘中读取数据了。

一旦在页缓存中命中了所需的数据页面,内核就会执行一个高效的数据传递操作。它会直接将缓存中的数据拷贝到用户进程提供的缓冲区中,就像上面 C 语言程序中的 buffer 数组。这个拷贝过程使用的是 copy_to_user 函数,它专门用于内核空间的数据安全地复制到用户空间。

继续用图书馆的例子,当管理员找到了你要的书(命中页缓存),他会直接把书递给你(将数据拷贝到用户缓冲区),而不需要你再去书架上取。这个过程非常迅速,因为数据已经在内存中了,避免了去磁盘读取的漫长等待时间。数据拷贝完成后,内核会从内核态返回到用户态,用户进程就可以继续执行后续的操作了,并且能够快速获取到所需的数据,这就是页缓存读命中带来的显著优势,大大加速了文件读取的速度。

2.2 缓存命中与未命中的处理逻辑

当页缓存未命中时,意味着所需的数据不在页缓存中,此时内核就需要从磁盘中读取数据。这个过程首先会触发一个缺页异常(Page Fault),这是操作系统用于处理内存访问异常的一种机制。在这种情况下,缺页异常表明进程试图访问的内存页面不在物理内存中,需要从磁盘加载。

内核在接收到缺页异常后,会通过虚拟文件系统(VFS)层调用具体文件系统(比如 ext4 文件系统)的 readpage 或 readpages 函数。这些函数负责将读取请求转换为块设备层操作,块设备层会将逻辑块地址(LBA)映射到物理磁盘位置,生成磁盘 I/O 请求。例如,在 ext4 文件系统中,readpage 函数会根据文件的 inode 信息和请求的偏移量,计算出需要读取的磁盘块位置,并将这些信息传递给块设备层。

接着,I/O 调度器会接手这些 I/O 请求,常见的 I/O 调度器有完全公平队列(CFQ)、截止时间调度器(Deadline)等。I/O 调度器的作用是对 I/O 请求进行优化排序,避免出现某个请求长时间得不到处理的情况,从而提高磁盘的整体 I/O 性能。它会根据不同的调度算法,将多个 I/O 请求合并、排序后发送给磁盘控制器。比如,CFQ 调度器会为每个进程分配大致相等的 I/O 带宽,保证各个进程的 I/O 请求都能得到及时处理;而 Deadline 调度器则会为每个请求设置一个截止时间,优先处理那些即将超过截止时间的请求,避免因 I/O 延迟导致系统性能下降。

在磁盘 I/O 请求完成后,数据会通过直接内存访问(DMA)技术被传输到内存缓冲区。DMA 是一种允许外部设备(如磁盘控制器)直接访问系统内存的技术,它绕过了 CPU,大大减轻了 CPU 的负担,使得数据传输可以在不占用 CPU 资源的情况下进行。想象一下,CPU 就像是一个忙碌的指挥官,DMA 技术就像是一个得力的助手,能够在不需要指挥官亲自参与的情况下完成数据搬运工作,让指挥官可以专注于其他重要任务。

数据传输完成后,内核会将读取到的数据填充到新分配的页面(struct page)中。这个新页面会被加入到页缓存中,同时更新与该文件相关的地址空间(address_space)的基数树(radix tree)。基数树是一种高效的数据结构,用于快速查找某个文件偏移量对应的页面,它就像是一本精确的索引目录,通过它可以快速定位到所需的数据页面。

最后,内核会将新分配的页面映射到用户进程的虚拟地址空间,这样用户进程就可以访问到从磁盘读取的数据了,进程继续执行后续的操作。整个过程就像是你在图书馆没找到想要的书(页缓存未命中),管理员(内核)从仓库(磁盘)调来了这本书,将它登记入库(加入页缓存),并告诉你书的位置(映射到虚拟地址空间),你就可以顺利借阅并阅读这本书(进程访问数据)了。通过这样一系列的操作,系统在页缓存未命中时,依然能够高效地从磁盘获取数据,并为后续的访问做好准备,保证了系统的正常运行。

2.3 脏页刷新:从页缓存到磁盘

在 Linux 系统中,当用户进程进行文件写入操作时,通常会调用 write 系统调用。比如在 C 语言中,我们可以这样写代码:

#include <stdio.h>#include <unist.h>intmain(){    const char* message = "Hello, Linux Page Cache!";    int fd = open("test.txt", O_WRONLY | O_CREAT, 0644);    if (fd < 0) {        perror("open");        return 1;    }    ssize_t bytes_written = write(fd, message, strlen(message));    if (bytes_written < 0) {        perror("write");    } else {        printf("Wrote %zd bytes to file.\n", bytes_written);    }    close(fd);    return 0;}

当 write 系统调用被执行时,用户进程会从用户态陷入内核态。内核首先会对文件描述符进行有效性检查,确保其指向的是一个可写的文件。然后,内核通过 copy_from_user 函数将用户空间缓冲区中的数据拷贝到内核空间的页缓存中。例如,上述代码中 message 字符串中的数据就会被拷贝到页缓存中。这个过程就像是你要把一份文件交给图书馆管理员(内核)保管,管理员先确认你要存放的地方(文件描述符)是否正确,然后把文件从你手中(用户空间)接过来,放到图书馆的临时存放区(页缓存)。

当数据成功写入页缓存后,对应的页面会被标记为脏页。这是因为此时页缓存中的数据与磁盘上的数据不一致了,页缓存中的数据是更新后的,而磁盘上的数据还是旧的。内核通过设置页面描述符(struct page)中的 PG_dirty 标志位来标记一个页面为脏页。脏页标记就像是给这个页面贴上了一个 “已修改,待同步” 的标签,告诉系统这个页面的数据需要被写入磁盘,以保证数据的一致性。例如,在上面的代码中,当 message 数据写入页缓存后,包含这些数据的页面就会被标记为脏页,等待后续被刷入磁盘。

为了提高磁盘 I/O 效率,内核并不会立即将脏页中的数据写入磁盘,而是会在合适的时机进行合并写操作。内核会将多个小的写操作暂时缓存起来,等到一定条件满足时,将这些写操作合并成一个大的写操作,一次性写入磁盘。这个条件可以是脏页的数量达到一定阈值,或者经过了一定的时间间隔。

比如,假设我们有多个进程不断地向同一个文件写入少量数据,如果每次写入都立刻同步到磁盘,那么会产生大量的磁盘 I/O 操作,严重影响系统性能。而内核会将这些小的写入操作先存储在页缓存中,当积累到一定数量的脏页或者达到一定时间时,将这些脏页的数据合并起来,一次性写入磁盘。这就好比你有很多小包裹要寄出去,如果每次都单独寄,不仅麻烦而且费用高,而快递公司(内核)会等到收集到一定数量的包裹后,一起打包寄出,这样就提高了运输效率。通过合并写操作,减少了磁盘 I/O 的次数,提高了磁盘的利用率,从而提升了整个系统的 I/O 性能。

当用户程序执行写操作时,数据并不会直接写入磁盘,而是先写入页缓存,此时该内存页的数据与磁盘不一致,被称为脏页。脏页的存在提升了写入效率,但也带来数据丢失风险。因此,内核必须在合适的时机将脏页数据同步到磁盘,这一过程称为脏页刷新。

内核提供了三种可靠的脏页刷新机制,确保数据安全与系统性能的平衡:

  1. 第一种是定时刷新。内核运行专门的内核线程,如 flusher 线程,周期性地扫描页缓存中的脏页。当脏页存在时间达到设定的阈值,或脏页所占内存达到一定比例时,线程会自动将脏页分批写入磁盘。定时刷新既避免频繁刷盘导致性能下降,又防止脏页长时间滞留带来的数据风险。
  2. 第二种是主动触发刷新。用户程序可以通过 fsync、fdatasync 等系统调用,强制内核立即将脏页数据写入磁盘,并等待 I/O 完成后再返回。这种方式常用于对数据安全性要求极高的场景,例如数据库写入、日志记录、关键文件保存等。主动刷新能保证数据立即持久化,但会带来一定的性能开销。
  3. 第三种是内存不足时的强制刷新。当系统内存紧张,内核需要回收页缓存内存时,会优先释放不脏的干净页。若干净页数量不足,内核会强制触发脏页刷新,将部分脏页写入磁盘后再释放内存,保证系统稳定运行。

三种刷新机制协同工作,使页缓存既能够提升文件读写效率,又能保证数据不会因断电、崩溃等意外情况丢失。

三、脏页回写机制

面试题写作模版

3.1 回写触发条件

脏页回写是保证内存与磁盘数据一致性的关键环节,其触发条件主要有以下几种:

(1)周期性回写:内核会周期性地触发脏页回写操作。内核会为每个回写设备初始化独立的定时器(wb_timer),超时时间由 vm.dirty_writeback_centisecs 内核参数控制,单位为 0.01 秒。当定时器超时,就会触发回写函数(如 wb_kupdate),该函数会遍历脏页链表,将一定数量的脏页写回到磁盘。这就好比图书馆管理员会定期检查书架上的书籍摆放是否整齐,将放错位置(脏页)的书籍放回原位(磁盘)。

(2)比例回写:当系统中的脏页数量达到一定比例时,会触发回写。这里涉及两个重要的内核参数:vm.dirty_background_ratio 和 vm.dirty_ratio。vm.dirty_background_ratio 表示当脏页占系统总内存的比例达到此值时,内核会启动后台回写线程,开始异步将脏页写回磁盘,默认值通常为 10%。

而 vm.dirty_ratio 则表示当脏页占系统总内存的比例达到该更高阈值时,新的写操作会被阻塞,直到脏页比例降低到阈值以下,默认值通常为 20%。例如,当系统内存为 100GB 时,若 vm.dirty_background_ratio 为 10%,则当脏页达到 10GB 时,后台回写线程启动;若 vm.dirty_ratio 为 20%,则当脏页达到 20GB 时,新的写操作会被阻塞,等待脏页回写以降低脏页比例。

(3)显式同步:当用户进程调用 sync、fsync 或 fdatasync 等系统调用时,会触发显式的脏页回写。sync 系统调用会将所有脏页都刷写到磁盘,确保内存中的数据与磁盘上的数据完全一致。fsync 系统调用则只针对指定文件描述符,将该文件对应的脏页和元数据刷写到磁盘。

fdatasync 与 fsync 类似,但它只保证文件数据一致,不更新部分元数据(如访问时间)。比如,数据库在关键事务完成后,会调用 fsync 确保数据持久化。

// 显式触发脏页回写(C 语言极简示例)int fd = open("test.log", O_WRONLY | O_CREAT);write(fd, "data"4);    // 写入内存,产生脏页fsync(fd);              // 显式触发回写,强制落盘close(fd);

(4)内存压力触发:当系统内存不足时,为了回收内存,内核在执行内存回收操作(如 kswapd 线程)时,如果遇到脏页,会先触发脏页回写,落盘后才能释放内存页。这就像图书馆书架空间不足,必须先把临时区的书籍放回仓库,才能腾出空位。

3.2 回写过程

在触发脏页回写后,具体回写由后台 writeback 线程执行(Linux 2.6.32+ 已废弃 pdflush)。线程从脏页链表获取页面,每个脏页都关联 address_space 结构,包含文件索引、磁盘地址等信息。

线程调用文件系统的 writepages 函数,通过块设备层提交 I/O 请求。例如 ext4 会根据 inode 和页偏移计算逻辑块地址,使用 submit_bio 下发写请求。

数据写入磁盘后,内核清除 PG_dirty 标记,页面变为干净页可回收复用。整个过程如同快递员按地址送达包裹,并标记已完成。

// 内核层回写简化逻辑(伪代码,帮助理解原理)struct page *page = get_dirty_page();if (PageDirty(page)) {    writepages(page->mapping);  // 写入磁盘    ClearPageDirty(page);       // 清除脏标记}

3.3 相关内核参数

脏页回写参数直接影响 I/O 性能,常用参数如下:

  1. vm.dirty_ratio:最大脏页比例,达到则阻塞新写。数据库场景可适当降低,保证实时性。
  2. vm.dirty_background_ratio:后台异步回写触发比例,不影响业务。
  3. vm.dirty_expire_centisecs:脏页最大存活时间,超时强制回写。
  4. vm.dirty_writeback_centisecs:回写线程周期性唤醒间隔。
# 查看/设置脏页回写参数(Linux 命令行示例)sysctl vm.dirty_ratio            # 查看sysctl vm.dirty_background_ratio # 查看sysctl -w vm.dirty_writeback_centisecs=500  # 修改周期为 5 秒

通过合理调整参数,可在性能、数据安全、I/O 负载之间取得最佳平衡。

四、页缓存的实际应用场景

面试题写作模版

页缓存不是抽象的内核机制,而是在实际工作中随处可见,尤其是在高 IO、高并发的场景中,页缓存的性能影响尤为明显。以下是几个典型应用场景,帮你将原理与实际工作结合起来。

4.1 静态文件服务

Nginx、Apache 等 Web 服务器,部署静态文件(HTML、CSS、JS、图片等)时,性能优化的核心就是利用页缓存。这些静态文件访问频率高、内容不变,一旦被加载到页缓存中,后续的访问都会直接命中缓存,极大提升响应速度。

比如一个图片文件,第一次访问时,Nginx 会从磁盘读取,加载到页缓存;之后成千上万的用户访问该图片,都从页缓存读取,无需访问磁盘,这也是静态文件服务能支撑高并发的关键。

4.2 数据库系统

数据库(如 MySQL、PostgreSQL)的性能,很大程度上依赖页缓存。数据库的表数据、索引数据,本质上都是磁盘文件,内核会将这些文件加载到页缓存中,数据库的查询操作,会优先从页缓存读取数据,减少磁盘 IO。

同时,数据库也会实现自己的缓存(如 MySQL 的 InnoDB 缓冲池),但页缓存是内核级的,是数据库缓存的“底层支撑”——即使数据库缓存未命中,若页缓存命中,也能减少磁盘 IO 的开销。

4.3 日志写入场景

后端程序的日志写入(如 Java 的 logback、Python 的 logging),默认都是“延迟写入”,依赖页缓存优化性能。程序写入日志时,数据先进入页缓存,内核后台批量刷新到磁盘,避免了每次写入日志都触发磁盘 IO,减少了对程序性能的影响。

但需要注意:如果程序崩溃,未刷新到磁盘的脏页数据会丢失,因此对于核心日志,需要通过 fsync 主动触发刷新,平衡性能和数据安全性。

五、页缓存的调优方法

面试题写作模版

5.1 调整页缓存大小

页缓存是 Linux 最主要的磁盘缓存载体,默认情况下内核会尽可能利用空闲内存提升缓存命中率,但过度占用会挤压应用程序、数据库、中间件等核心服务的内存空间,引发 OOM 或性能抖动。我们可以通过内核参数,灵活控制页缓存的占用上限和内存置换策略:

(1)vm.pagecache_limit_mb:该参数用于硬性限制页缓存的最大占用内存,单位为 MB。适用于内存资源紧张、核心应用对内存要求极高的场景(如 Java 应用、数据库服务)。例如一台 16GB 内存的服务器,需为应用预留 12GB 内存,可将页缓存上限设置为 4096MB(4GB),避免缓存无限制抢占内存;而对于大内存静态资源服务器(如图片、文件存储),可适当调高该值,最大化利用内存提升缓存效率。

# 查看当前页缓存最大限制sysctl vm.pagecache_limit_mb# 临时设置页缓存最大为 4GB(4096MB)sysctl -w vm.pagecache_limit_mb=4096# 永久写入配置echo "vm.pagecache_limit_mb=4096" >> /etc/sysctl.confsysctl -p

(2)vm.swappiness:控制内核内存回收的置换倾向,取值范围 0~100,直接决定内存不足时,内核优先回收页缓存还是交换分区(Swap)数据。

# 查看当前 swappinesssysctl vm.swappiness# IO 密集型业务(静态资源、缓存类)sysctl -w vm.swappiness=10# 计算型业务sysctl -w vm.swappiness=60
  • 值越低(0~20):内核越倾向于保留页缓存,优先置换 Swap 分区数据,适合 IO 密集型业务(如 Nginx 静态文件服务、日志读取服务),能大幅提升缓存命中率;
  • 值越高(60~100):内核越倾向于回收页缓存,优先保留应用程序内存页,适合计算密集型业务;
  • 生产环境通用最优实践:IO 密集型服务设为 10-20,通用业务设为 30-50,禁止设置为 0(极端情况下会禁用 Swap,引发内存溢出风险)。

5.2 优化预读大小

预读是页缓存提升读性能的核心机制:内核会预判程序的连续读取行为,提前将磁盘数据加载到页缓存,让后续读取直接命中内存。预读大小直接影响连续读场景的性能,内核提供了精细化的配置方式:

# 查看当前磁盘预读大小(KB)cat /sys/block/sda/queue/read_ahead_kb# 大文件场景(日志、视频、备份)设置为 512KBecho 512 > /sys/block/sda/queue/read_ahead_kb# 小文件场景(配置、短文本)设置为 64KBecho 64 > /sys/block/sda/queue/read_ahead_kb

内核通过 vm.readahead_size(全局参数)和块设备级别的/sys/block/<磁盘名>/queue/read_ahead_kb(局部参数,单位 KB)控制预读大小,设备级参数优先级高于全局参数,默认值通常为 128KB。

  • 大文件场景(视频文件、日志文件、数据库大表扫描、备份文件):文件连续存储、读取顺序性强,可将预读大小调高至 256KB~1024KB,减少磁盘 IO 次数,大幅提升读取吞吐量;
  • 小文件场景(配置文件、短文本、接口日志):文件碎片化、随机读多,过大的预读会造成内存浪费、缓存污染,建议调低至 64KB 及以下;
  • 调优方式:无需重启服务器,直接修改磁盘配置即可实时生效,例如 sda 磁盘执行 echo 512 > /sys/block/sda/queue/read_ahead_kb。

5.3 合理使用文件 IO 接口

页缓存的效率不仅依赖内核配置,更与应用程序的 IO 接口选择强相关。开发人员可根据业务数据特性,选择最优的文件操作方式,规避缓存污染、内存占用过高、数据不一致等问题:

1)标准缓存 IO(read/write 系统调用):最常用的文件操作方式,完全依赖页缓存:读操作先访问页缓存,未命中再读取磁盘;写操作先写入页缓存,由内核异步回写。适合高频读取、小文件、非核心数据(如配置文件、静态资源、普通日志),性能最优。

// 读文件:自动使用页缓存int fd = open("app.log", O_RDONLY);read(fd, buf, 1024);  // 先读缓存,未命中再读磁盘close(fd);

2)直接 IO(O_DIRECT 标志):在 open 函数中添加 O_DIRECT 标志,完全跳过页缓存,数据直接在应用缓冲区和磁盘之间传输。适合数据库写入、大文件备份、日志落盘等场景:既可以避免大文件读写污染页缓存,又能减少内核数据拷贝,精准控制数据落盘逻辑。注意:使用直接 IO 需满足内存对齐、块大小对齐要求,否则会触发内核降级处理。

// O_DIRECT:跳过页缓存,直接访问磁盘int fd = open("backup.db", O_RDWR | O_DIRECT);

3)同步落盘 IO(fsync/fdatasync):配合标准缓存 IO 使用,主动触发脏页回写,强制将页缓存中的数据刷入磁盘。适合交易数据、订单信息、数据库事务等核心业务数据,确保断电不丢失数据,满足数据持久化要求。

write(fd, data, len);    // 写入页缓存(脏页)fsync(fd);               // 强制回写磁盘,保证数据不丢失

4)临时无缓存 IO(O_SYNC 标志):写入操作同步落盘,不依赖内核异步回写,实时性最强,但性能损耗较大,仅适用于极高安全性要求的场景。

5.4 清理页缓存(应急运维操作)

页缓存会长期占用内存,在系统内存紧急不足、性能测试、问题排查等特殊场景下,可通过内核提供的接口手动清理缓存,释放内存资源。该操作仅用于应急和测试,禁止生产环境频繁、定时执行。清理命令需 root 权限执行,内核通过/proc/sys/vm/drop_caches 接口实现分级清理:

  • echo 1 > /proc/sys/vm/drop_caches:仅清理页缓存,快速释放文件数据占用的缓存内存;
  • echo 2 > /proc/sys/vm/drop_caches:清理内核目录项缓存(dentry)和 inode 缓存,适用于文件元数据占用过高的场景;
  • echo 3 > /proc/sys/vm/drop_caches:全面清理,同时释放页缓存、目录项缓存和 inode 缓存,释放内存最多。

重要注意事项:

  • 清理页缓存不会丢失磁盘数据,仅清除内存中的临时缓存;
  • 清理后,后续所有文件读取都会重新从磁盘加载,产生大量磁盘 IO,会导致业务性能瞬时下降;
  • 禁止编写定时任务自动清理缓存,这会完全破坏页缓存的工作机制,严重降低系统性能。

5.5 补充:脏页回写联动调优(页缓存核心配套优化)

页缓存的写入性能直接由脏页回写机制决定,在调优页缓存的同时,建议配合脏页参数优化:

  • 高写入业务:降低 vm.dirty_ratio 和 vm.dirty_background_ratio,避免大量脏页阻塞业务;
  • 高性能存储业务:调高 vm.dirty_writeback_centisecs,减少频繁回写带来的 IO 抖动。

通过页缓存大小、预读、IO 接口、脏页机制的组合调优,可让系统在缓存命中率、内存利用率、磁盘 IO 性能之间达到最佳平衡,适配各类生产业务场景。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-04 00:11:15 HTTP/2.0 GET : https://f.mffb.com.cn/a/489391.html
  2. 运行时间 : 0.227974s [ 吞吐率:4.39req/s ] 内存消耗:4,561.80kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=aec24d19a1cf2826037dc0b294d0bc57
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000572s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000575s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.044855s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.001610s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000677s ]
  6. SELECT * FROM `set` [ RunTime:0.003013s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000728s ]
  8. SELECT * FROM `article` WHERE `id` = 489391 LIMIT 1 [ RunTime:0.008331s ]
  9. UPDATE `article` SET `lasttime` = 1783095075 WHERE `id` = 489391 [ RunTime:0.017932s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.011303s ]
  11. SELECT * FROM `article` WHERE `id` < 489391 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.013751s ]
  12. SELECT * FROM `article` WHERE `id` > 489391 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006273s ]
  13. SELECT * FROM `article` WHERE `id` < 489391 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004572s ]
  14. SELECT * FROM `article` WHERE `id` < 489391 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.017677s ]
  15. SELECT * FROM `article` WHERE `id` < 489391 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002034s ]
0.229946s