当前位置:首页>Linux>读懂 HugePage,搞定 Linux 内存性能优化

读懂 HugePage,搞定 Linux 内存性能优化

  • 2026-06-30 01:44:42
读懂 HugePage,搞定 Linux 内存性能优化

在 Linux 内存体系中,页是内存管理的最小基础单元,默认标准页大小仅 4KB。高并发业务、数据库、中间件等大内存场景下,进程占用的虚拟内存动辄数 GB,会产生海量页表项。页表数量暴涨不仅占用大量内核内存,还会加剧 CPU 寻址开销、TLB 缓存失效与 Page Fault 缺页异常,直接拖垮系统吞吐与响应延迟,这也是很多线上服务内存卡顿、性能抖动的底层根源。

HugePage 大页机制正是为解决这类痛点而生,通过采用 2MB、1GB 等超大内存页尺寸,大幅减少页表数量、降低 TLB miss 概率、缓解频繁缺页异常。理解 HugePage 的底层原理、分类差异、配置方式与适用场景,是进阶 Linux 内存性能优化的必修课。本文将从基础概念出发,逐层拆解大页的工作机制、使用场景、配置方法以及生产环境调优要点,帮你彻底吃透 HugePage,落地真实业务的内存性能优化。

一、Linux 内存寻址基础知识面试题写作模版

在深入探究 HugePage 之前,我们先来夯实一下 Linux 内存寻址的基础知识,这将为我们后续理解 HugePage 的原理与优势奠定坚实的基础。

1.1 三类核心地址解析

在 Linux 内存管理体系中,有三类核心地址:虚拟地址、物理地址和总线地址,它们各自扮演着独特的角色,相互协作,共同完成内存的访问与管理。

  • 虚拟地址:这是进程或内核 “看到” 的地址,并非实际的物理内存地址,而是操作系统分配的逻辑地址。每个进程都拥有独立的用户态虚拟地址空间,这使得进程之间的内存相互隔离,提高了系统的安全性和稳定性。例如,在 32 位操作系统中,虚拟地址范围是 0x00000000 - 0xFFFFFFFF,足足有 4GB;而 64 位系统的虚拟地址范围更是高达 0x0 - 0xFFFFFFFFFFFFFF(256T) 。这种虚拟地址空间的划分,为进程提供了一个看似无限的内存空间,让每个进程都以为自己独占了大量内存,实际上是通过操作系统的巧妙映射,与物理内存进行关联。
  • 物理地址:它是内存芯片实际的硬件地址,对应着物理内存的存储单元,比如 DRAM(动态随机存取存储器)中的某个存储单元。物理地址由内存控制器进行管理,CPU 通过地址总线发送物理地址来访问内存,其范围由实际安装的内存大小决定。例如,一台配备 8GB 内存的机器,其物理地址范围就是 0x00000000 - 0x1FFFFFFFF。物理地址是实实在在的内存位置,是数据最终存储和读取的地方。
  • 总线地址:主要是外设(如 DMA 控制器、网卡)在直接访问内存(DMA 操作)时所看到的地址。在部分架构中,总线地址与物理地址是一致的,比如常见的 x86 架构;但在一些嵌入式架构(如 ARM)中,可能需要通过 IOMMU(输入输出内存管理单元)进行转换。在驱动开发中,开发者需要特别注意 DMA 地址与物理地址的映射关系,确保数据在内存和外设之间的正确传输。

这三类地址之间的关系紧密且复杂。虚拟地址通过内存管理单元(MMU)的转换,映射到物理地址,从而实现进程对实际物理内存的访问;而总线地址则在内存与外设交互时发挥作用,它与物理地址的关系因架构而异,在数据传输过程中,需要根据具体情况进行地址的转换和适配。 理解这三类地址,是深入研究 Linux 内存管理的第一步。

1.2 MMU 与 TLB

内存管理单元(MMU)和翻译后备缓冲器(TLB)是内存寻址过程中至关重要的硬件组件,它们默默工作,却对系统性能有着决定性的影响。

  • MMU 的核心功能:MMU 就像是虚拟地址和物理地址之间的 “翻译官”,它的主要职责是完成虚拟地址到物理地址的转换,并对内存访问权限进行严格检查。当 CPU 需要访问内存时,会发送虚拟地址,MMU 首先根据虚拟地址的页号在页表中进行查找,获取对应的物理页框号。这个过程就像是在一本巨大的地址转换字典(页表)中查找虚拟地址对应的物理地址。同时,MMU 会检查当前的访问权限,判断是只读、可写还是执行操作,以及当前是处于用户态还是内核态。如果访问权限不足,比如用户态试图访问内核态地址,MMU 就会触发页错误异常,通知操作系统进行相应的处理。最后,MMU 将获取到的物理页框号与页内偏移进行拼接,生成最终的物理地址,以便 CPU 能够准确地访问内存中的数据。
  • TLB 的缓存加速:在多级页表的转换过程中,每次都需要多次访问内存来查询页表,这会导致寻址延迟过高。为了解决这个问题,TLB 应运而生。TLB 是一个高速缓存,它缓存了近期使用的虚拟地址到物理地址的映射关系。当 CPU 发送虚拟地址进行内存访问时,MMU 会首先查询 TLB。如果 TLB 命中,就可以直接从 TLB 中获取物理地址,这个过程的延迟仅为 1 - 2 个 CPU 周期,大大提高了内存访问效率。但如果 TLB 缺失,就会触发 TLB 缺失异常,内核需要重新走页表转换流程来获取物理地址,并将新的映射关系更新到 TLB 中,以备后续使用。在实时系统中,通常会使用巨页(HugePage)来减少 TLB 项数量,从而降低 TLB 缺失率,进一步提升系统性能。这是因为巨页减少了页表项数量,使得 TLB 能够更有效地缓存映射关系,减少了因 TLB 缺失导致的内存访问延迟。

MMU 和 TLB 在内存寻址过程中相辅相成,MMU 负责准确的地址转换和权限检查,TLB 则通过缓存映射关系来加速这一过程。它们的协同工作,保证了系统高效、稳定地进行内存访问,为各类应用程序的运行提供了坚实的基础。看到这里还不理解,请查看这篇《MMU、TLB、TWU深度剖析:打破砂锅问到底

1.3 内存分页与页表

内存分页和页表是 Linux 内存管理的核心机制,它们将虚拟内存和物理内存划分为固定大小的页,并通过页表建立起两者之间的映射关系,实现了内存的有效管理和灵活分配。

  • 内存分页机制:虚拟内存和物理内存都被划分为固定大小的 “页(Page)” 和 “页框(Page Frame)”。页是虚拟内存的最小分配单位,由操作系统定义,在 Linux 系统中,默认的页大小是 4KB,但也可以根据实际需求配置为 2MB 或 1GB 的巨页。进程的虚拟地址空间被划分为一个个连续的页,每个页对应着一段虚拟地址范围。例如,对于 4KB 的页,其地址范围可能是 0x0000 - 0xFFF、0x1000 - 0x1FFF 等。页框则是物理内存的最小分配单位,其大小与页完全一致。物理内存同样被划分为连续的页框,每个页框都有唯一的物理地址,是物理内存的实际存储单元。在内存管理中,一个虚拟页通过页表映射到一个物理页框,实现了虚拟地址到物理地址的转换。同时,多个虚拟页也可以映射到同一个物理页框,这种情况常见于共享内存和写时复制等场景,提高了内存的利用率。
  • 页表的关键作用:页表是操作系统维护的一张 “虚拟页到物理页框” 的映射表,它不仅存储了虚拟页与物理页框的对应关系,还记录了页的访问权限,如读、写、执行权限,以及用户态和内核态的访问限制,同时还包含存在标志,用于指示该页是否已经映射到物理页。页表的组织格式依赖于 CPU 架构,不同的架构有不同的定义,比如 x86 架构采用 PTE(页表项)格式,ARM 架构采用 TTB(转换表基址)格式。这些特定的格式能够被 MMU 硬件识别,从而用于地址转换。
  • 页内偏移的计算原理:由于页大小固定,虚拟地址和物理地址都可以拆分为 “页号(Page Number)” 和 “页内偏移(Offset)” 两部分。页号用于索引页表,通过在页表中查找页号,可以找到对应的物理页框号。而页内偏移则直接映射到物理地址的偏移部分,无需进行转换,这是因为虚拟页和物理页框的大小是一致的。以 4KB 页为例,在 32 位地址中,页内偏移占用 12 位(因为 4KB = 2^12B),虚拟地址可以表示为 [页号 (20 位) | 页内偏移 (12 位)]。假设虚拟地址为 0x12345678,那么页号就是 0x12345,偏移就是 0x678。通过公式 “地址 = 页 (框) 号 * 页大小 + 页内偏移”,就可以计算出实际的物理地址。

内存分页和页表机制是 Linux 内存管理的基石,它们通过将内存划分为页的形式,实现了虚拟内存与物理内存的有效映射和管理,为操作系统的高效运行和进程的隔离提供了保障。同时,页内偏移的计算方式也使得地址转换更加高效和准确,是理解内存管理的关键所在。看到这里还不理解,请查看这两篇《Linux内存分页机制:解锁高效内存管理方式》《Linux arm64内存工作原理:页表与虚拟地址底层逻辑

1.4 多级页表

在内存管理中,多级页表是一项重要的优化技术,它有效解决了单级页表存在的内存浪费问题,提高了内存的使用效率。

  • 单级页表的内存浪费困境:单级页表虽然结构简单,但存在严重的内存浪费问题。以 32 位系统为例,假设页大小为 4KB,32 位虚拟地址空间的大小为 2^32 = 4GB。由于每个页的大小是 4KB(2^12B),所以需要 2^20(4GB / 4KB)个页表项(PTE)来映射整个虚拟地址空间。如果每个 PTE 占用 4 字节,那么单级页表的总大小就是 2^20 * 4B = 4MB。在多进程场景下,问题更加突出。例如,当系统中有 1024 个进程时,每个进程都需要一套独立的页表系统,那么仅页表就会占用 1024 * 4MB = 4GB 的物理内存,这几乎占据了整个 32 位系统的物理内存空间,显然是不可接受的。而且,在实际应用中,进程往往并不会使用到整个虚拟地址空间,但单级页表仍然会为其分配完整的页表,这就造成了大量的内存浪费。
  • 多级页表的优化逻辑:为了解决单级页表的内存浪费问题,多级页表应运而生。多级页表的核心思想是 “按需分配页表项”,它将页号拆分为多个层级,根据进程实际使用的虚拟地址范围来创建下级页表,未使用的范围则无需分配页表。以 x86_64 的 4 级页表为例,页号被拆分为 9 + 9 + 9 + 9 位,每个层级的页表项仅 512 个(因为 9 位可以索引 2^9 = 512 个项),单个页表的大小为 512 * 8B = 4KB(刚好一个页框的大小)。即使进程使用全部地址空间,总页表大小也仅为 4 级 * 2^9 * 4KB = 8MB,相比单级页表的 4GB,大大减少了内存占用。再比如 32 位操作系统采用 2 级页表时,将页号拆分为 10 位 + 10 位。一级页表(PGD,页全局目录)有 2^10 = 1024 个项,大小为 4KB;二级页表(PTE)只有在进程实际使用到相应的虚拟地址范围时才会分配。假设进程只使用了 100 个页,那么二级页表只需要 100 * 4KB = 400KB,而不是像单级页表那样分配 4MB 的内存。

多级页表通过合理的层级划分和按需分配机制,极大地减少了页表占用的内存空间,提高了内存的使用效率。它在内存管理中发挥着关键作用,使得系统能够更加高效地管理和利用内存资源,为多进程环境下的系统性能提升提供了有力支持。

二、HugePage 大页机制详解

面试题写作模版

2.1 HugePage 是什么?

HugePage,中文可称为 “大页”,是 Linux 系统中一种优化内存管理的技术 。在传统的内存分页机制中,页的大小通常为 4KB,而 HugePage 打破了这种常规,它使用更大的页大小来管理内存,常见的大页大小有 2MB 和 1GB。这就好比传统的小仓库隔间(4KB 小页)被合并成了更大的仓库隔间(2MB 或 1GB 大页)。

大页的出现主要是为了解决大内存应用场景下传统小页内存管理的不足。在大数据处理、虚拟化、高性能计算等场景中,内存使用量动辄数 GB 甚至数 TB。以 4KB 的小页来管理如此庞大的内存,会导致页表项数量急剧增加。而 HugePage 通过使用更大的页大小,显著减少了页表项的数量,从而节省了内存空间,提高了页表查找的效率。同时,大页还能提高地址转换后备缓冲器(TLB)的命中率,减少内存访问的延迟,提升内存访问性能。 

举个例子,在一个虚拟化环境中,一台物理服务器上运行着多个虚拟机,如果使用传统的小页机制,每个虚拟机的内存管理都需要大量的页表项,这会占用大量的内存资源,并且会导致 TLB 命中率降低,影响虚拟机的性能。而使用 HugePage 大页机制,每个虚拟机可以使用大页来管理内存,减少了页表项的数量,提高了 TLB 命中率,从而提升了虚拟机的性能。

2.2 为什么需要 HugePage?

在传统的 4KB 小页内存管理模式下,有几个明显的问题在大内存场景中会被无限放大。首先是页表项数量的问题。当系统中运行着需要大量内存的应用时,比如一个占用几十 GB 内存的数据库系统,就会产生海量的页表项。每个 4KB 的小页都需要一个对应的页表项来记录它的映射关系,这么多页表项不仅会占用大量的内存空间,还会增加 CPU 在查找页表时的开销 。想象一下,你有一个超级大的图书馆,每本书都有一个单独的小标签记录位置,找一本书的时候,要在密密麻麻的标签中去查找,效率肯定高不了。

其次,小页管理模式下 TLB 的命中率较低。TLB 是 CPU 中的一个高速缓存,专门用来缓存虚拟地址到物理地址的映射关系 。由于 TLB 的容量有限,如果使用 4KB 小页,在处理大量内存访问时,TLB 很容易就被填满,导致频繁的 TLB 未命中。一旦 TLB 未命中,CPU 就不得不去内存中查找页表,这会带来很大的性能开销,就像是你要找的书不在常用书架(TLB)上,只能去巨大的书库(内存中的页表)里慢慢翻找,时间就浪费在这个查找过程中了 。

HugePage 的出现,就像是给内存管理带来了一场革新。它通过使用更大的页面来管理内存,直接减少了页表项的数量。以 2MB 的大页为例,一个 2MB 的大页相当于 512 个 4KB 的小页,也就是说,使用 2MB 大页时,页表项数量可以减少到原来的 1/512 。这大大节省了内存空间,同时也让 CPU 查找页表的速度大幅提升,就好比在图书馆里,把很多小标签合并成了大标签,找书的时候一下子就能定位到一大片区域,效率自然就高了。

同时,大页内存还能显著提升 TLB 的命中率 。因为大页占用的内存空间更大,相同数量的 TLB 条目可以覆盖更多的内存,从而减少了 TLB 未命中的次数。还是用图书馆的例子来说,把常用书架(TLB)上的小格子变成了大格子,一本书占的空间大了,书架上能放的书虽然数量少了,但每本书被找到的概率却大大增加了,这样就能更快地拿到想要的书,对应到计算机中,就是更快地访问到需要的内存数据。

2.3 HugePage 的工作原理

(1)减少页表项数量:在传统的 4KB 页大小的内存管理中,页表项数量与内存大小紧密相关。例如,对于一个拥有 64GB 内存的系统,按照 4KB 的页大小计算,页表项数量 = 64GB / 4KB = 16777216 个。如此庞大的页表项不仅占用大量的内存空间,而且在查找页表时,需要遍历大量的表项,这大大增加了查找的时间成本,降低了内存访问的效率。

而当采用 HugePage 大页机制时,情况就大不相同了。如果使用 2MB 的大页,同样是 64GB 内存的系统,大页数量 = 64GB / 2MB = 32768 个,页表项数量也相应减少为 32768 个,相比 4KB 页大小的页表项数量,大幅减少。如果使用 1GB 的大页,大页数量 = 64GB / 1GB = 64 个,页表项数量更是减少到了极致。这就好比在一个大型图书馆中,传统的小页机制就像是把每本书都单独编目,目录非常庞大复杂;而大页机制则像是把多本书归为一类进行编目,目录简洁明了,查找起来更加高效。通过减少页表项数量,HugePage 不仅节省了内存空间,还提高了页表查找的效率,使得内存访问更加迅速。

(2)提高 TLB 命中率:TLB 作为 CPU 的高速缓存,在内存访问中扮演着至关重要的角色。它缓存了最近使用的虚拟地址到物理地址的映射关系,当 CPU 需要访问内存时,首先会在 TLB 中查找对应的映射关系。如果 TLB 命中,就可以直接获取物理地址,大大缩短了内存访问的时间;如果 TLB 未命中,就需要去内存中查找页表,这会增加内存访问的延迟。

在传统的 4KB 页大小的情况下,由于页表项数量众多,TLB 的覆盖范围有限,很容易出现 TLB 未命中的情况。例如,一个进程频繁访问不同的内存区域,而这些区域对应的页表项可能无法全部缓存到 TLB 中,就会导致 TLB 频繁未命中,增加内存访问的延迟。而 HugePage 大页机制的优势就在于,它使用更大的页大小,使得每个页表项对应的内存范围更大。这样,TLB 中一个条目可以映射更大的内存区域,从而增加了 TLB 的覆盖范围。

当进程访问内存时,被映射的内存区域更有可能在 TLB 中找到对应的映射关系,进而提高了 TLB 的命中率。还是以图书馆为例,TLB 就像是图书馆的快速检索区,传统小页机制下,快速检索区能存放的书籍索引有限;而大页机制则扩大了快速检索区的索引范围,一本书(内存区域)更有可能在快速检索区找到对应的索引(映射关系),提高了检索效率,也就是提高了内存访问性能。

(3)降低内存碎片:在传统的小页内存管理机制中,频繁的内存分配和释放就像在一个大仓库里不断地划分和合并小隔间。当不同大小的内存需求不断出现时,内存会被分割成许多不连续的小块,就像仓库里的小隔间变得杂乱无章,这就产生了内存碎片。这些内存碎片会导致即使总内存空间充足,但由于无法找到连续的大块内存,一些大内存需求无法得到满足,从而降低了内存的利用率。

而 HugePage 大页机制采用更大的页大小进行内存分配,就好比在仓库里使用更大的隔间。当有内存需求时,优先分配大页,这样减少了内存被分割的次数。即使出现内存释放的情况,由于大页的存在,内存碎片的产生也会大大减少。因为大页本身就是较大的内存块,不容易被分割成过多的小块。这就使得内存空间更加连续,提高了内存的利用率,就像仓库里的隔间更加规整,能更充分地利用空间。

2.4 大页小页如何协同工作

在 Linux 内核中,大页(2MB、1GB 等)与小页(4KB)并非孤立存在,而是通过多级页表映射实现了巧妙的共存,共同为系统的内存管理服务。

以 x86_64 架构的 4 级页表为例,虚拟地址被划分为多个部分,用于索引不同层级的页表。对于 4KB 小页,虚拟地址的页表项(PTE)层级有效,页表遍历需要到 PTE 层级才能终结,一个 PTE 对应 4KB 的物理内存。而对于 2MB 大页,内核会将 PTE 位设置为 0,页表遍历到中间页目录(PMD)层级就可以终结,一个 PMD 直接对应 2MB 的物理内存,覆盖了原本 512 个 PTE 的范围。对于 1GB 大页,内核将 PMD 和 PTE 位都设置为 0,页表遍历到上级页目录(PUD)层级终结,一个 PUD 对应 1GB 的物理内存。

这种页表层级的动态切换,使得内核能够根据不同的内存访问需求,灵活地决定使用大页还是小页映射。对于那些对内存访问性能要求极高的地址段,如数据库的缓冲区,内核会选择使用 PMD 或 PUD 层级的大页映射,以减少页表查询次数,提高内存访问速度;而对于普通的地址段,如用户进程的堆内存,内核则使用 PTE 层级的小页映射,以充分利用内存空间,提高内存分配的灵活性。在一个同时运行数据库和多个普通应用程序的系统中,数据库的内存使用部分可以采用大页映射,而普通应用程序则使用小页映射,两者在同一个进程地址空间内和谐共存,互不干扰。

为了实现大页与小页的协同工作,内核还配备了独立的内存分配机制。小页由伙伴系统进行管理,它负责分配和回收小页内存,以满足系统对小内存块的需求。而大页则由 hugetlbfs 文件系统管理,它为大页提供了专门的内存池。在静态大页机制下,内核启动时会通过 hugepagesz 和 nr_hugepages 参数预留一块连续的物理内存作为大页专用池,与小页的内存池相互隔离。在透明大页机制下,内核通过 khugepaged 守护进程扫描内存,将连续的小页合并为大页,大页与小页在物理内存中可以动态转换,共享伙伴系统的内存池。

// 4KB 小页:遍历到 PTE#define PAGE_SHIFT      12#define PAGE_SIZE(1UL << PAGE_SHIFT)// 4KB// 2MB 大页:使用 PMD 映射#define PMD_SHIFT       21#define PMD_SIZE(1UL << PMD_SHIFT)// 2MB// 1GB 大页:使用 PUD 映射#define PUD_SHIFT       30#define PUD_SIZE(1UL << PUD_SHIFT)// 1GB// 判断是否为大页映射#define is_hugepmd()(pmd_flags(pmd) & _PAGE_PSE)  // 2MB#define is_hugepud()(pud_flags(pud) & _PAGE_PSE)  // 1GB

2.5 静态大页与透明大页

在 HugePage 机制中,静态大页和透明大页是两种重要的实现方式,它们各自具有独特的特点。

静态大页需要手动配置,在系统启动或运行时,用户需要明确指定大页的数量和大小。例如,通过修改内核启动参数 “hugepagesz = 2M nr_hugepages = 1024” 来预留 1024 个 2MB 的大页,这些大页会在系统启动时被预留出来,形成一个独立的内存池,与小页使用的内存池完全隔离。应用程序需要显式地通过特定的系统调用(如 mmap 或 shmget)并使用 MAP_HUGETLB 标志来申请和管理大页内存。

这种方式的优点是性能可预测,因为大页是预先分配好的,系统在运行时不会触发内存整理任务,对于对内存稳定性要求高的场景,如虚拟化环境中的 KVM 虚拟机、高性能数据库等非常适用,能够确保大页的分配和使用效率更高,减少动态分配的开销,同时避免了碎片化问题。然而,它的缺点也很明显,手动配置增加了管理复杂度,预分配的大页区域如果未被充分利用,就会导致内存浪费,而且一旦预分配的大页不足,很难在运行时动态调整,可能会导致性能下降。

使用 mmap + MAP_HUGETLB 显式申请静态大页代码示例:

// 1. 内核配置:分配 2MB 静态大页 1024 个// echo 2097152 > /proc/sys/vm/hugepagesz// echo 1024 > /proc/sys/vm/nr_hugepages// 2. 应用程序显式分配静态大页(2MB)void *addr = mmap(NULL, 2 * 1024 * 1024,                  PROT_READ | PROT_WRITE,                  MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,                  -10);

透明大页则实现了自动管理,对应用程序透明,无需用户干预或显式配置。内核的 khugepaged 守护进程会在系统运行时动态地将连续的小页(通常是 4KB)合并成大页(通常是 2MB) 。如果内存分布不连续,存在碎片,它还会触发后台内存整理任务,将分散的小页整理成连续的物理内存块以分配大页。在内存分配上,它具有灵活性,系统可以在小页和大页之间动态切换,如果无法分配大页,系统会自动回退到小页模式。这使得它适用于大多数通用场景,应用程序无需修改即可使用大页,简化了管理,同时减少了 TLB 缺失,提高了 TLB 缓存命中率。

但是,它也存在一些缺点,动态分配大页和后台内存整理可能会引入额外开销,特别是在高并发或内存紧张时,可能导致性能抖动。如果系统内存碎片化严重,透明大页可能频繁回退到小页模式,降低了使用大页带来的收益,而且如果分配的大页中数据利用率较低,也会造成内存空间的浪费。

三、HugePage 在 Linux 中的配置与实践

面试题写作模版

3.1 查看系统对 HugePage 的支持

在开始配置 HugePage 之前,我们首先要了解系统对 HugePage 的支持情况。在 Linux 系统中,可以通过查看/proc/meminfo 文件来获取大页内存的相关信息。打开终端,输入以下命令:

cat /proc/meminfo | grep -i huge

执行该命令后,会输出一系列与大页相关的信息,常见的字段有:

  • HugePages_Total:表示系统中配置的大页总数。
  • HugePages_Free:表示当前空闲的大页数量。
  • HugePages_Rsvd:是被预保留但尚未实际分配的大页数量。
  • HugePages_Surp:额外的大页数量,通常在启用了超大页的超分功能时会用到。
  • Hugepagesize:显示每个大页的大小,常见的是 2MB 或 1GB。

假设执行命令后得到如下输出:

HugePages_Total:       0HugePages_Free:        0HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:       2048 kB

这表明当前系统尚未配置大页,每个大页的默认大小为 2MB。通过这些信息,我们可以清晰地了解系统大页内存的当前状态,为后续的配置工作提供依据。

3.2 配置 HugePage 的步骤

(1)静态预留大页: 要在系统中静态预留大页,需要编辑/etc/sysctl.conf 文件。使用文本编辑器,如 vim,打开该文件:

sudo vim /etc/sysctl.conf

在文件末尾添加一行:

vm.nr_hugepages = [数量]

这里的[数量]需要根据实际需求填写,比如你希望预留 512 个大页,就将其设置为 512。这个数值的确定需要综合考虑系统内存大小、应用内存需求等因素。一般来说,可以先根据应用的内存使用量估算,比如应用需要 1GB 的大页内存,若大页大小为 2MB,则需要设置 vm.nr_hugepages = 512(1GB / 2MB = 512) 。

添加完成后,保存并关闭文件。然后执行以下命令使配置生效:

sudo sysctl -p

执行 sudo sysctl -p 命令后,系统会读取/etc/sysctl.conf 文件中的配置,并应用新的设置。此时,可以再次使用 cat /proc/meminfo | grep -i huge 命令查看大页配置是否生效,HugePages_Total 的值应该会更新为你设置的大页数量。

(2)挂载 hugetlbfs 文件系统: 接下来,我们需要挂载 hugetlbfs 文件系统,以便应用程序能够以文件的方式映射大页内存。首先,创建一个挂载点,例如/hugepages:

sudo mkdir /hugepages

然后,使用 mount 命令挂载 hugetlbfs 文件系统:

sudo mount -t hugetlbfs none /hugepages

-t hugetlbfs 指定了文件系统类型为 hugetlbfs,none 表示设备名称(对于伪文件系统来说可以为 none),/hugepages 是挂载点。为了使挂载在系统重启后仍然生效,可以编辑/etc/fstab 文件,添加一行:

none /hugepages hugetlbfs defaults 00

这样,每次系统启动时,hugetlbfs 文件系统都会自动挂载到/hugepages 目录。挂载完成后,应用程序就可以通过 mmap 等系统调用,利用 MAP_HUGETLB 标志来映射/hugepages 目录下的文件,从而使用大页内存。

(3)应用启用 HugePage: 不同的应用程序启用 HugePage 的方式有所不同。以 Oracle 数据库为例,需要在其初始化参数文件(通常是 init.ora 或 spfile)中设置参数 use_large_pages=only (推荐)或 use_large_pages=true。设置为 only 时,如果大页不足,实例将直接启动失败(报错 ORA-27123),这有助于确保数据库在有足够大页支持的情况下运行;设置为 true 时,若大页不足,数据库会尝试使用普通页。同时,启动 Oracle 数据库的用户的 ulimit -l(内存锁定限制)需要设置为 unlimited,以确保能够绑定大页内存。

对于 PostgreSQL 数据库,需要在 postgresql.conf 配置文件中设置 huge_pages = on 来启用大页支持。并且,shared_buffers 的值需要足够大(建议至少为 128MB),以确保能够充分利用大页内存,同时 shared_buffers 的值必须能被大页大小整除。例如,如果大页大小为 2MB,shared_buffers 可以设置为 128MB(128MB / 2MB = 64,能整除)。设置完成后,重启 PostgreSQL 服务使配置生效。

在 DPDK(Data Plane Development Kit)应用中,启用大页则需要在启动脚本中通过--huge-dir 参数指定大页挂载目录(如/hugepages),并确保在启动前系统已经预留了足够的大页。例如,启动一个 DPDK 应用的命令可能如下:

./dpdk_app --huge-dir /hugepages

这样,DPDK 应用就可以利用大页内存来提高数据包处理的性能。不同应用启用大页的具体方式和参数设置,需要参考各自的官方文档和最佳实践。

四、配置 HugePage 的注意事项

面试题写作模版

4.1 内存连续性问题

HugePage 的分配依赖于连续的物理内存,这是它与传统小页内存分配的一个重要区别。在系统运行过程中,内存会不断地被分配和释放,久而久之,就可能出现内存碎片化的情况。当内存碎片化严重时,即使系统中总的空闲内存足够,但连续的空闲内存块可能无法满足大页的分配需求,从而导致大页分配失败 。

例如,假设系统中有 10GB 的空闲内存,但这些空闲内存被碎片化,可能每一块连续的空闲内存都小于 2MB(大页大小),那么当我们尝试分配一个 2MB 的大页时,就会因为找不到连续的 2MB 空闲内存而失败。解决这个问题的思路主要有以下几种:

  1. 内存整理:在 Linux 系统中,可以通过 echo 1 > /proc/sys/vm/compact_memory 命令来尝试整理内存 。这个命令会触发内核的内存整理机制,将分散的空闲内存块合并成更大的连续内存块,从而提高大页分配成功的几率。不过,内存整理过程可能会占用一定的系统资源,并且在内存碎片化非常严重的情况下,可能效果并不理想。
  2. 重启系统:最简单粗暴但往往很有效的方法就是重启系统。重启后,系统内存处于一个相对初始的状态,没有过多的内存分配和释放操作,此时内存碎片化程度较低,更容易分配到连续的物理内存来创建大页。
  3. 合理规划内存使用:从应用程序层面出发,尽量避免频繁地分配和释放内存,尤其是大内存块。可以采用内存池等技术,预先分配一定数量的内存,并重复利用这些内存,减少内存碎片化的产生。

4.2 权限和配置文件设置

应用程序在使用 HugePage 时,对用户权限有一定的要求。通常情况下,普通用户可能没有足够的权限来直接使用大页内存,需要具备 CAP_IPC_LOCK 能力,这在一些系统中可能需要将用户添加到特定的组或者通过修改/etc/security/limits.conf 文件来设置 。

例如,在使用 Oracle 数据库时,如果 Oracle 用户没有足够的内存锁定权限,即使系统已经配置好了大页内存,数据库也无法正常使用大页。我们需要在/etc/security/limits.conf 文件中为 Oracle 用户添加如下配置:

oracle soft memlock unlimitedoracle hard memlock unlimited

这样才能确保 Oracle 用户在启动数据库时能够成功使用大页内存。另外,相关的配置文件设置不当也可能导致问题。比如在配置/etc/sysctl.conf 文件时,如果参数写错或者格式不正确,就无法正确设置大页数量。例如,将 vm.nr_hugepages 写成了 vm.nr_hugepage(少了最后的 s),那么在执行 sudo sysctl -p 时,就会报错,导致大页配置无法生效。

解决这类问题,首先要仔细检查配置文件中的参数拼写和格式是否正确,确保与官方文档或相关教程一致。如果对配置文件的修改不确定是否正确,可以先备份原文件,然后逐步修改并测试,观察系统的反应和大页配置的生效情况。同时,在修改权限相关的设置时,要注意安全性,避免赋予用户过高的权限,以免造成安全风险。

4.3 透明大页(THP)的干扰

透明大页(Transparent HugePage,THP)是 Linux 内核的另一项内存优化机制,它与 HugePage 虽然都涉及大页内存,但工作方式有所不同 。透明大页由内核自动管理,会在系统运行过程中动态地将小页合并成大页,对应用程序是透明的,不需要应用程序显式地请求和配置 。

当透明大页与 HugePage 共存时,可能会产生一些问题。一方面,两者可能会在内存分配和管理上产生冲突,导致大页分配的不确定性和性能波动 。例如,透明大页的动态合并机制可能会影响到 HugePage 的连续内存分配,使得 HugePage 分配失败或者分配的大页数量不稳定 。另一方面,透明大页在内存碎片化严重时,也可能无法有效地合并小页,导致自身性能下降,同时还会干扰 HugePage 的正常工作。

为了避免透明大页对 HugePage 的干扰,我们可以检查并关闭透明大页。检查透明大页状态的方法如下:

cat /sys/kernel/mm/transparent_hugepage/enabled

如果输出结果中包含 always,则表示透明大页处于启用状态;如果是 never,则表示已禁用 。关闭透明大页的方法有以下几种:

(1)临时关闭:执行以下命令可以临时关闭透明大页:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

这种方式在系统重启后会失效,如果需要永久关闭,还需要进行下一步操作。

(2)永久关闭:编辑/etc/default/grub 文件,在 GRUB_CMDLINE_LINUX 参数中添加 transparent_hugepage=never ,例如:

GRUB_CMDLINE_LINUX="... transparent_hugepage=never"

保存并退出文件后,执行 sudo update-grub 命令更新 GRUB 配置,然后重启系统,透明大页就会被永久关闭。

五、HugePage 的应用场景

面试题写作模版

5.1 数据库系统

在数据库领域,像 Oracle、MySQL 这样的巨头,它们处理的数据量往往是海量的。以 Oracle 数据库为例,当它管理着数 TB 大小的数据库时,数据的读取和写入操作非常频繁。在传统的 4KB 页大小下,数据库需要管理的页表项数量极其庞大,这不仅占用了大量的内存空间,还使得查询操作时地址转换的开销增大,导致查询响应时间变长。

而当启用 HugePage 大页机制后,情况就大为改观。假设 Oracle 数据库的系统全局区(SGA)为 16GB,如果使用 4KB 的小页,页表项数量 = 16GB / 4KB = 4194304 个;若使用 2MB 的大页,大页数量 = 16GB / 2MB = 8192 个,页表项数量大幅减少。这意味着在查询数据时,CPU 查找页表的时间大大缩短,同时 TLB 命中率提高,数据能够更快地被读取到,从而显著提高了查询性能。在 MySQL 数据库中,对于一些复杂的查询语句,如涉及多表关联、大量数据过滤的查询,使用大页机制可以减少内存碎片,提高内存利用率,使得数据库能够更高效地缓存数据和索引,进一步提升查询效率。

5.2 虚拟化环境

在虚拟化的世界里,一台物理服务器往往需要承载多个虚拟机,每个虚拟机都有自己的内存需求。当使用传统的内存管理方式时,虚拟机与宿主机之间的内存管理开销较大。例如,当虚拟机进行内存分配和释放操作时,宿主机需要频繁地更新页表,这会占用大量的 CPU 资源和内存带宽。

而引入 HugePage 大页机制后,情况得到了改善。以 VMware 虚拟化环境为例,当启用大页支持后,虚拟机的内存以大页的形式进行管理。这减少了页表项的数量,使得虚拟机与宿主机之间的内存管理更加高效。在一台物理服务器上运行多个虚拟机,每个虚拟机运行不同的应用程序,如 Web 服务器、邮件服务器等。使用大页机制后,虚拟机之间的内存竞争减少,内存分配和释放的效率提高,从而提高了虚拟机的整体性能,每个应用程序在虚拟机中都能更稳定、高效地运行。

5.3 高性能计算(HPC)与大数据处理

在高性能计算和大数据处理领域,数据量巨大且计算任务复杂。以科学计算中的分子模拟为例,它需要处理大量的原子坐标数据,计算原子之间的相互作用力,这些计算需要频繁地访问内存。在传统的内存管理模式下,由于页表项众多,内存访问延迟较高,会严重影响计算效率。

而采用 HugePage 大页机制,能够优化内存访问性能。在一个大规模的分子模拟计算中,使用大页后,内存访问延迟降低,计算速度得到显著提升。在大数据处理框架如 Hadoop、Spark 中,它们需要管理和处理海量的数据。以 Hadoop 的 MapReduce 任务为例,在数据的读取、处理和写入过程中,大页机制可以减少内存碎片,提高内存利用率,使得数据处理效率大幅提高。当处理 PB 级别的数据时,使用大页机制能够让数据处理任务更快地完成,为数据分析和决策提供更及时的支持。

end

如果这篇文章对你有所启发,欢迎点赞、在看,转发三连。星标⭐账号,还可以第一时间收到推送,感谢你的收看,我们下期再见~

往期干货推荐

【专栏模块嵌入式Linux
专栏模块】性能优化
专栏模块】面试八股文
专栏模块项目实战
【硬核干货缺了这些,别说你懂 Linux内核
硬核干货】缺了这些,别说你懂 Linux C/C++
【学习思维导图】Linux内核源码自主学习路线

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 19:19:27 HTTP/2.0 GET : https://f.mffb.com.cn/a/491395.html
  2. 运行时间 : 0.105402s [ 吞吐率:9.49req/s ] 内存消耗:4,696.20kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=5962b0cc0b125149a1c0e099d1e99e38
  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.000633s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000683s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000900s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000643s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000661s ]
  6. SELECT * FROM `set` [ RunTime:0.000198s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000544s ]
  8. SELECT * FROM `article` WHERE `id` = 491395 LIMIT 1 [ RunTime:0.001487s ]
  9. UPDATE `article` SET `lasttime` = 1783077568 WHERE `id` = 491395 [ RunTime:0.014665s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000307s ]
  11. SELECT * FROM `article` WHERE `id` < 491395 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000422s ]
  12. SELECT * FROM `article` WHERE `id` > 491395 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000374s ]
  13. SELECT * FROM `article` WHERE `id` < 491395 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004018s ]
  14. SELECT * FROM `article` WHERE `id` < 491395 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000974s ]
  15. SELECT * FROM `article` WHERE `id` < 491395 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.008774s ]
0.107065s