`
samuschen
  • 浏览: 405593 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

linux的内存为什么总是占用率很高

阅读更多

磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。

内存页

上一篇 Linux 性能监测:Memory 提到了内存和硬盘之间的 IO 是以页为单位来进行的,在 Linux 系统上1页的大小为 4K。可以用以下命令查看系统默认的页面大小:

$ /usr/bin/time -v date
...
Page size (bytes): 4096
...

缺页中断

Linux 利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内 存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被 交换进内存,一切都有内核的虚拟内存管理来完成。当程序启动的时候,Linux 内核首先检查 CPU 的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(Page Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor Page Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次 缺页中断。

上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很 显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。 要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。下面的 time 命令可以用来查看某程序第一次启动的时候产生了多少主缺页中断和次缺页中断:

$ /usr/bin/time -v date
...
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 260
...

File Buffer Cache

从上面的内存缓存区(也叫文件缓存区 File Buffer Cache)读取页比从硬盘读取页要快得多,所以 Linux 内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系 统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。我们运行 Linux 一段时间后会发现虽然系统上运行的程序不多,但是可用内存总是很少,这样给大家造成了 Linux 对内存管理很低效的假象,事实上 Linux 把那些暂时不用的物理内存高效的利用起来做预存(内存缓存区)呢。下面打印的是 VPSee 的一台 Sun 服务器上的物理内存和文件缓存区的情况:

$ cat /proc/meminfo
MemTotal:      8182776 kB
MemFree:       3053808 kB
Buffers:        342704 kB
Cached:        3972748 kB

这台服务器总共有 8GB 物理内存(MemTotal),3GB 左右可用内存(MemFree),343MB 左右用来做磁盘缓存(Buffers),4GB 左右用来做文件缓存区(Cached),可见 Linux 真的用了很多物理内存做 Cache,而且这个缓存区还可以不断增长。

 

 

I

 

分享到:
评论

相关推荐

    dotNet Core 内存占用过高的解决方案.docx

    dotNet Core 内存占用过高的解决方案dotNet Core 内存占用过高的解决方案

    解决 linux 下 buffcache 占用过高的问题.docx

    通常情况下,Linux内核能很好地管理内存,只有在系统性能受到影响或内存资源紧张时才需要进行干预。在优化过程中,应当结合实际情况,避免盲目清理缓存,以免影响系统整体性能。对于Java应用,还需要关注JVM的内存...

    Linux CPU占用率高故障排查.docx

    Linux CPU 占用率高故障排查 Linux CPU 占用率高故障排查是一种常见的故障现象,需要通过系统监控和性能分析工具来排查和解决。下面是 Linux CPU 占用率高故障排查的知识点总结: 一、问题一:高 CPU 利用率一定就...

    CPU占用高

    如果系统内存不足,CPU可能会花费更多时间进行页面交换,导致CPU占用率升高。检查内存使用情况并考虑增加物理内存或优化内存分配。 5. **编程错误**: 对于开发者来说,源码级别的分析至关重要。如果问题出在自编...

    kswapd0进程占用CPU非常高--解决方案.docx

    当kswapd0的CPU占用率过高,可能有以下几个原因: 1. **内存不足**:这是最常见的情况,系统可能正在经历内存压力,导致kswapd0频繁地进行页面交换,消耗大量CPU资源。 2. **内存泄漏**:应用程序或系统服务可能...

    JAVA 进程在64位LINUX下占用巨大内存的分析.doc

    在 64 位 LINUX 系统上,JAVA 进程的内存占用是一个非常重要的问题。根据给定的文件信息,我们可以看到,JAVA 进程在 64 位 LINUX 下占用了巨大内存,达到 11G,已分配地址空间更是 17G。这是一个非常严重的问题,...

    线上应用故障排查之一:高CPU占用

    首先,我们需要理解CPU占用率高的可能原因。这可能由以下几种情况引起: 1. **代码执行效率低**:如果应用中存在大量的循环计算、递归调用或无谓的资源消耗,如未优化的数据库查询,都可能导致CPU负载增加。 2. **...

    linux服务器找到占用cpu高的java代码的办法

    4. **分析JStack日志**:打开`jstack.log`,寻找CPU占用率高的线程。线程堆栈中显示的调用路径就是当前正在执行的代码路径。如果某个线程的堆栈中有很多重复的调用,那很可能就是问题所在。 5. **代码审查**:根据`...

    cpu内存占用程序.rar

    "CPU内存占用程序.rar" 提供的工具或指南可能针对Linux和Windows Server操作系统,帮助管理员监控和管理资源使用情况。以下是相关知识点的详细说明: 1. **CPU占用率**:CPU占用率是衡量处理器工作负载的重要指标。...

    JProfiler对应用服务器内存泄漏问题诊断解决方案.docx

    2. 在图形一中,我们可以看到 Full GC 回收后的内存占用率走势(红色曲线),上午基本平滑上升到 20%(内存占用率),中午开始上升到 30%,下午上升到 40%。 3. 在图形二中,我们可以看到 Full GC 回收后的内存占用...

    Linux 服务器的性能参数指标总结.doc

    当 iowait 占用率过高的时候,通常意味着某些程序的 IO 操作效率很低,或者 IO 对应设备的性能很低以至于读写操作需要很长的时间来完成。 3. 内存类 parameter 指标总结: 内存是服务器性能的另一个重要指标。...

    Android 查看CUP占用率

    执行该命令后,终端会持续显示实时更新的进程列表,其中包括PID(进程ID)、USER(所有者)、VSS(虚拟内存大小)、RSS(常驻内存大小)、%CPU(CPU占用率)等信息。 示例: ```bash adb shell top -n 1 -d 5 ``` ...

    解决Linux下php-fpm进程过多导致内存耗尽问题

    当服务器的内存使用率过高,例如达到92%,这可能是内存耗尽的迹象。使用`free -m`命令可以查看当前内存状态,而`top`命令则能提供更详细的进程资源使用情况。通过这些命令,我们可以发现内存主要被php-fpm的子进程...

    BIG-IP系统Linux主机部分内存问题故障排除方法

    对于一些特殊场景,如swap利用率很高但没有明显进程消耗大量物理内存的情况,可能需要检查Linux内核的缓存使用情况。从BIG-IP v12.1.0开始,qkview命令的输出包含了`slabtop`的信息,可以帮助识别是否有特定的内核...

    Linux下查看CPU使用\系统资源使用情况

    `top`命令是Linux下的一个强大工具,它能够实时显示系统中各个进程的资源占用情况,类似于Windows的任务管理器。以下是关于`top`命令的详细说明: 1. **基本概念** - **CPU使用率**:CPU使用率分为用户空间(us)...

    virtual box 使用手册

    **1.1 为什么虚拟化技术如此有用?** 虚拟化技术能够将一台物理计算机分割成多个独立的虚拟环境,每个环境都可以运行自己的操作系统和应用程序。这对于资源的有效利用、测试和开发环境的快速搭建等方面具有重要意义...

    linux性能监测工具

    如果 load average 值很高,表明服务器的 CPU 已经饱和,需要进行优化。 2. dmesg dmesg 命令是用于显示内核信息的工具。它可以帮助您诊断服务器硬件故障、添加硬件时出现的问题等。dmesg 命令的输出结果包括了...

    易语言源码易语言取指定进程CPU占用率源码.rar

    3. **取指定进程CPU占用率**:获取特定进程的CPU占用率通常需要操作系统级别的接口,例如Windows API中的`GetProcessTimes`函数,或者Linux系统调用如`/proc/pid/stat`文件。易语言提供了一系列API调用来实现这些...

Global site tag (gtag.js) - Google Analytics