/proc/vmstat 中的参数 (pgpgin、pswpin) 和 (pswpout、pgpgout) 之间究竟有什么区别?

/proc/vmstat 中的参数 (pgpgin、pswpin) 和 (pswpout、pgpgout) 之间究竟有什么区别?

请注意,这个问题只针对linuxswap space我说的是指专用的swap partition

google对此进行了一些研究,发现了以下这些definitions

Paging refers to writing portions, termed pages, of a process’ memory to disk.
Swapping, strictly speaking, refers to writing the entire process, not just part, to disk.
In Linux, true swapping is exceedingly rare, but the terms paging and swapping
often are used interchangeably.

page-out: The system's free memory is less than a threshold "lotsfree" and unnused / least used pages are moved to the swap area.
page-in: One process which is running requested for a page that is not in the current memory (page-fault), it's pages are being brought back to memory.
swap-out: System is thrashing and has deactivated a process and it's memory pages are moved into the swap area.
swap-in: A deactivated process is back to work and it's pages are being brought into the memory.

现在,您可能想将这个问题与询问分页和交换之间的差异的问题重复。但我想再多问一点。在任何时间点,这些计数器是否/proc/vmstat互斥?我的意思是,参数是否pswpin包含一些计数,pgpgin反之亦然?当一个进程时究竟会发生什么deactivated?如果所有页面都移动到swap空间,那么它与多个究竟有何不同pageouts?此外,如果pagein每次发生页面错误时都会发生,那么对于此事件,可以对其他两个参数pgmajfault和说些什么pgfault?是否每当pagefault (major? minor?)发生时,相应的pagein也会发生?

如果建议使用一些示例程序/基准来测试这些单独的参数,那将会很有帮助。

附言:我可能会继续添加/编辑问题:)

答案1

这是一个老问题,至今还没有正确答案。

首先,CPU 和内核将内存划分为所谓的页面。页面大小由 CPU 的架构决定,许多架构支持多种不同的页面大小,但 x86_64 架构中最常见的页面大小为 4KB。您提到的这些参数显示了有多少内存页面被读取/写入磁盘,其中有多少是交换页面。

请记住页面进入是 Linux 内核中的正常活动,几乎每次将二进制文件从磁盘(未缓存)加载到操作内存中时都会发生这种情况 - 也就是每次启动任何应用程序时。

因为 pgin 和 pgout 操作并不总是需要担心的事情,所以创建了仅包含交换信息的附加计数器 - 即 pswpin 和 pswpout 计数器 - 当内存页面被写入交换或从交换中读取时,它们会增加。

再说一遍 - 这也不表示存在问题,它只表示在某些情况下存在问题 - 例如当您看到这些数字在短时间内发生很大变化时(通常是当您的系统内存不足时)。

简而言之:

  • pgpgin、pgpgout - 从磁盘读取并写入内存的页面数,通常不需要太关心这些数字
  • pswpin、pswpout - 你可能想要跟踪这些数字(通过一些监控,比如 prometheus),如果出现峰值,则意味着系统正在大量交换,并且你遇到了问题

答案2

  1. pgpgin — 系统每秒从磁盘调入的千字节数。
  2. pgpgout — 系统每秒分页到磁盘的千字节数。
  3. pswpin — 系统每秒从磁盘换入的千字节数。
  4. pswpout — 系统每秒换出到磁盘的千字节数。

相关内容