linux内存优化
linux 内存不足的解决方法
linux 内存不足的解决方法
当Linux系统遇到内存不足的情况时,可以采取以下一些解决方法:
1. 释放内存:可以通过结束不必要的进程或服务来释放内存。
可以使用命令如kill或systemctl停止不需要的进程或服务。
2. 优化内存使用:检查系统中是否有内存占用过高的进程或服务,通过优化它们的配置或使用更高效的算法来减少内存使用量。
3. 增加物理内存:如果系统频繁出现内存不足的情况,可以考虑增加物理内存。
这可以通过添加更多的内存条或更换更大容量的内存条来实现。
4. 使用交换空间:Linux系统可以使用交换空间(swap)来扩展可用内存。
可以通过创建和启用交换分区或交换文件来增加交换空间。
但是,使用交换空间会导致性能下降,因此它只适合临时解决内存不足的情况。
5. 优化内存管理:通过调整内核参数,如vm.swappiness和vm.overcommit_memory,可以优化Linux系统的内存管理策略,以更好地利用可用内存。
6. 使用内存压缩技术:一些Linux发行版支持内存压缩技术,如zswap和zram,可以将一部分内存数据进行压缩,从而提高可用内存的效率。
7. 限制内存使用:对于一些应用程序或服务,可以通过限制其可用内存来避免系统内存不足的情况。
可以使用工具如cgroups或
ulimit来设置内存限制。
需要根据具体情况选择适合的解决方法。
建议在进行任何更改之前,先进行充分的备份和测试,以避免可能的问题和风险。
linux系统内核参数优化-linux快速入门教程
linux系统内核参数优化-linux快速⼊门教程内核的 shmall 和 shmmax 参数SHMMAX= 配置了最⼤的内存segment的⼤⼩ ------>这个设置的⽐SGA_MAX_SIZE⼤⽐较好。
SHMMIN= 最⼩的内存segment的⼤⼩SHMMNI= 整个系统的内存segment的总个数SHMSEG= 每个进程可以使⽤的内存segment的最⼤个数配置信号灯( semphore )的参数:SEMMSL= 每个semphore set⾥⾯的semphore数量 -----> 这个设置⼤于你的process的个数吧,否则你不得不分多个semphore set,好像有process+n之说,我忘了n是⼏了。
SEMMNI= 整个系统的semphore set总数SEMMNS=整个系统的semphore总数shmall 是全部允许使⽤的共享内存⼤⼩,shmmax 是单个段允许使⽤的⼤⼩。
这两个可以设置为内存的 90%。
例如 16G 内存,16*1024*1024*1024*90% = 15461882265,shmall 的⼤⼩为 15461882265/4k(getconf PAGESIZE可得到) = 3774873。
修改 /etc/sysctl.confkernel.shmmax=15461882265kernel.shmall=3774873kernel.msgmax=65535kernel.msgmnb=65535执⾏ sudo sysctl -p可以使⽤ ipcs -l 看结果。
ipcs -u 可以看到实际使⽤的情况========================================================================linux 内存管理⼀、前⾔本⽂档针对OOP8⽣产环境,具体优化策略需要根据实际情况进⾏调整;本⽂档将在以下⼏个⽅⾯来阐述如何针对RedHat Enterprise Linux 进⾏性能优化。
Linux系统性能优化脚本使用Shell脚本实现对Linux系统性能的优化和调整
Linux系统性能优化脚本使用Shell脚本实现对Linux系统性能的优化和调整Linux是一种常用的操作系统,广泛应用于服务器、个人电脑等领域。
随着系统的使用时间的增长,系统性能可能会逐渐下降,为了保持系统的高效运行,我们可以通过使用Shell脚本来进行性能优化和调整。
本文将介绍如何使用Shell脚本进行Linux系统性能的优化。
一、优化磁盘空间磁盘空间在Linux系统中扮演着重要的角色,因为磁盘空间的占用情况直接影响到系统的运行速度和稳定性。
通过使用Shell脚本,我们可以进行磁盘空间的优化。
下面是一个简单的脚本示例,用于删除指定目录下的临时文件:```shell#!/bin/bash# 清理临时文件temp_dir="/tmp"rm -rf ${temp_dir}/*```此脚本将清理/tmp目录下的所有临时文件。
您可以根据自己的需求修改脚本,并将其添加到定时任务中,以定期清理临时文件。
二、优化内存使用内存是系统性能的关键因素之一。
通过优化内存使用,可以提高系统的响应速度和稳定性。
下面是一个示例脚本,用于释放Linux系统中的内存:```shell#!/bin/bash# 释放内存sync; echo 3 > /proc/sys/vm/drop_caches```此脚本通过将3写入/proc/sys/vm/drop_caches文件来释放内存。
您可以根据需要修改脚本并将其添加到定时任务中,以定期释放内存。
三、优化网络性能网络性能是Linux系统中的另一个重要因素。
通过优化网络设置,可以提高系统的网络传输速度和稳定性。
下面是一个示例脚本,用于优化TCP/IP设置:```shell#!/bin/bash# 优化TCP/IP设置sysctl -w net.ipv4.tcp_max_syn_backlog=65536sysctl -w dev_max_backlog=65536sysctl -w net.ipv4.tcp_tw_recycle=1sysctl -w net.ipv4.tcp_tw_reuse=1```此脚本通过修改sysctl参数来优化TCP/IP设置。
linux调优参数
在Linux系统上,可以通过调整参数来优化系统的性能和功能。
以下是一些常见的Linux调优参数:内存管理:vm.swappiness:调整交换分区的使用频率,默认值为60,建议将其设置为10或更低的值,以减少交换分区的使用。
vm.min_free_kbytes:设置系统保留的空闲内存量,默认值为64,建议根据实际情况调整。
vm.max_map_count:设置进程可以拥有的最大内存映射数量,默认值为65536,如果需要运行大量进程或使用大量内存映射,可以适当增加该值。
网络性能:net.ipv4.tcp_tw_reuse:允许重用TIME_WAIT套接字,默认值为0,建议将其设置为1以减少TIME_WAIT套接字数量。
net.ipv4.tcp_fin_timeout:设置TIME_WAIT套接字的超时时间,默认值为60秒,可以适当增加该值以减少TIME_WAIT套接字数量。
net.ipv4.tcp_keepalive_time:设置TCP keepalive探测的间隔时间,默认值为75秒,可以适当增加该值以避免因长时间不活动而断开连接。
文件系统:fs.file-max:设置系统可以同时打开的最大文件数量,默认值为1024,可以根据实际情况调整。
fs.nr_open:设置系统进程可以同时打开的文件数量上限,默认值为8192,可以根据实际情况调整。
CPU 调度:kernel.sched_min_granularity_ns:设置最小调度时间粒度,默认值为1000000纳秒(1毫秒),可以根据实际情况调整。
kernel.sched_migration_cost_ns:设置CPU调度迁移的开销时间,默认值为500000纳秒(半毫秒),可以适当增加该值以提高系统在多核处理器上的性能。
系统进程:kernel.panic:设置系统崩溃时的重启次数,默认值为1,建议将其设置为0以避免系统无限重启。
fs.inotify.max_user_instances:设置系统可以监视的文件系统实例数量上限,默认值为8192,可以根据实际情况调整。
linux中内存优化的方法
linux中内存优化的方法如何在Linux系统中进行内存优化引言:在Linux系统中,内存管理是非常重要的一项任务,它直接影响着系统的性能和稳定性。
一个高效的内存管理策略可以提高系统的吞吐量,减少延迟,提高响应速度。
本文将介绍一些常用的方法和策略,帮助用户进行Linux系统的内存优化。
一、了解Linux内存管理机制在开始优化内存之前,我们需要了解Linux的内存管理机制。
Linux内核使用页面机制来管理内存,将物理内存划分为一个个大小相等的页面。
Linux使用页表来记录页面的使用情况,并采用虚拟内存管理技术将其与物理内存映射起来。
内核根据页面的使用情况来管理内存,包括页面分配、页面回收和页面交换等。
二、观察和分析内存使用情况在进行内存优化之前,我们需要了解当前系统的内存使用情况。
可以通过工具如top、free等来观察系统的内存占用情况。
在观察内存占用时,需要注意以下几个指标:总内存使用量、空闲内存量、缓存和缓冲区使用量、交换内存使用量等。
这些指标可以帮助我们判断系统是否存在内存不足或内存泄漏等问题。
三、优化内存分配策略Linux内存管理机制中的一项重要任务是内存分配。
优化内存分配策略可以使系统更加高效地利用内存资源。
以下是一些常用的内存分配优化策略:1. 预分配内存池:对于需要频繁分配和释放内存的应用程序,可以使用内存池技术进行优化。
通过预先分配一块连续的内存空间,应用程序可以直接从内存池中获取内存,而不需要频繁的内存分配和释放操作,从而提高效率。
2. 使用伙伴系统算法:Linux内存管理中使用伙伴系统算法来分配大块的内存页。
这个算法将可用内存分成不同的块,每个块的大小都是2的幂次方。
应用程序可以使用kmalloc函数来分配和释放这样的内存块,而不需要频繁地进行页表的更新操作。
3. 避免过度分页:在Linux中,过度分页会导致额外的开销,降低系统的性能。
可以通过合理设置分页大小来避免过度分页。
同时,可以使用Transparent Huge Pages(THP)来减少页表的数量,提高内存的访问效率。
实验8Linux的内存管理
内存管理的概念
内存管理的定义
内存管理是指操作系统对计算机内存 资源的分配、回收、保护和扩充等一 系列操作,以确保系统高效、稳定地 运行。
内存管理的目标
提高内存利用率,减少内存碎片,实 现多任务环境下的内存共享和保护, 以及提供虚拟内存等。
Linux内存管理的特点
分段和分页机制
Linux采用分段和分页机制来管理内存,将物理内 存划分为大小相等的页框,同时将进程地址空间 划分为多个段,每个段对应一个页表项,实现地 址空间的隔离和权限控制。
。
03 通过实验操作和观察,加深对Linux内存管理的 理解和认识。
实验环境
操作系统
Linux(建议使用Ubuntu或CentOS等常见发行版 )
开发工具
GCC编译器、GDB调试器、Valgrind内存检测工 具等。
实验材料
一台配置有Linux操作系统的计算机,具备基本的 编程和调试能力。
02
Linux内存管理概述
VS
共享内存的实现方式
在Linux中,共享内存可以通过shmget() 、shmat()和shmdt()等系统调用来实现 。首先,使用shmget()函数创建一个共 享内存段;然后,使用shmat()函数将共 享内存段连接到当前进程的地址空间;最 后,使用shmdt()函数将共享内存段从当 前进程的地址空间中分离。
06
内存优化与性能提升
内存泄漏问题及其解决方案
内存泄漏定义
内存泄漏是指程序在申请内存后,未能正确释放,导致系统内存逐 渐耗尽的现象。
检测工具
使用Valgrind等内存检测工具,可以检测程序中的内存泄漏问题。
解决方案
及时释放不再使用的内存,避免不必要的内存申请,采用智能指针等 RAII技术来管理内存。
Linux操作系统中的内存管理和优化技术
Linux操作系统中的内存管理和优化技术在Linux操作系统中,内存管理是一项非常重要的任务。
因为在计算机系统中,内存是最主要的资源之一,也是最容易被浪费或滥用的资源之一。
因此,在Linux系统中要做好内存管理,就必须要清楚该系统如何使用内存、怎样管理内存,以及如何优化内存使用。
一、Linux内存的分类在Linux系统中,我们一般将内存分为两种类型:物理内存和虚拟内存。
物理内存是指计算机实际存在的内存,而虚拟内存是指计算机中的硬盘空间,它在计算机中被用作为一种虚拟化内存的技术。
这种技术使得计算机可以虚拟出额外的内存空间,从而提高系统的内存使用效率。
二、Linux内存的使用在Linux系统中,内存不是一次性分配给所有程序使用的,而是按需分配的。
当系统需要更多内存时,它会从空闲的内存中分配出一部分,然后再使用这些内存来支持系统进程和应用程序。
此外,Linux系统中还有一个内存缓存,它可以帮助系统将经常被访问的数据存储在内存中,以便快速响应用户请求。
三、Linux内存管理在Linux系统中,内存管理模块负责管理系统的内存使用。
这个模块会跟踪系统内存使用情况,并将一部分内存分配给正在运行的进程和应用程序。
此外,如果系统内存使用过量,内存管理模块还能回收不必要的内存,并将其分配给更需要的进程或应用程序。
四、Linux内存优化技术1. 内存调整在Linux系统中,我们可以使用内存调整技术来优化内存使用。
这种技术可以通过修改内核参数来增加系统的内存使用效率。
我们可以使用sysctl命令来修改内核参数。
2. 内存抖动在Linux系统中,如果内存使用过量,就会出现内存抖动的情况。
内存抖动是指系统频繁地将一页内存从内存中换出,然后再将其换入内存。
这种过程会导致系统速度变慢,因此我们需要采取一些措施来优化内存使用。
我们可以在系统中使用Swap分区和Swap文件来降低内存抖动的风险。
3. 内存清理在Linux系统中,我们可以使用内存清理技术来优化内存使用。
linux虚拟机磁盘空间不足的解决方法
Linux虚拟机磁盘空间不足的解决方法当Linux虚拟机磁盘空间不足时,您可以尝试以下几种解决方法:1.清理大文件:o定期清理不再需要的文件,特别是大型文件或目录,例如缓存目录。
o使用du -h --max-depth=1命令来查找当前目录下的大目录,并手动清理。
o如果需要查找更深层次的目录,可以修改max-depth的值。
2.扩展虚拟机内存:o如果虚拟机内存不足,可以在虚拟机设置中扩展磁盘容量。
o使用如gparted这样的工具来扩展内存。
首先安装gparted 工具,然后打开它进行磁盘分区和扩展操作。
o扩展后,使用df -h命令查看系统内存,确保内存已成功扩展。
o将新增的空间添加到逻辑卷中,例如使用lvextend命令。
o根据文件系统类型(如xfs),使用相应的命令(如xfs_growfs)来扩大分区大小。
3.挂载新分区:o如果可能,可以格式化新的分区并将其挂载到虚拟机中,以增加可用空间。
o创建挂载目录,使用mkdir命令。
o使用mount命令将新分区挂载到创建的目录下。
o使用df -h命令查看挂载情况。
o为了使挂载在重启后仍然有效,需要修改/etc/fstab文件,添加相应的挂载信息。
4.合并磁盘文件:o如果虚拟机磁盘文件过大,可以考虑合并磁盘文件以释放空间。
o找到虚拟机的磁盘文件地址。
o在虚拟机文件夹内创建一个新文件夹。
o使用vmware-vdiskmanager.exe命令合并磁盘文件,并指定新的磁盘文件地址。
o完成后,将系统镜像文件夹中的相关配置文件复制到新文件夹。
5.删除不必要的软件包和日志文件:o使用包管理器(如apt、yum或dnf)删除不再需要的软件包。
o清理日志文件,特别是那些占用大量空间的日志文件。
6.检查并清理临时文件:o清理/tmp目录下的临时文件。
o使用tmpwatch或类似的工具定期清理临时文件。
7.压缩文件:o对于一些不经常访问但又不能删除的大文件,可以考虑使用压缩工具(如gzip、bzip2或xz)进行压缩。
linux系统优化的方法
linux系统优化的方法
1.减少启动服务:通过启动项和初始化项,关闭一些不必要的服
务和软件,以实现启动更快,占用资源更少的目的。
2.修改内核参数:根据服务器的硬件情况,调整一些内核参数,
以达到更好的性能和资源管理。
3.安装监控工具:通过安装监控工具(如top、iostat、vmstat)分析服务器的负载情况,如CPU、内存、磁盘、网络等方面的使用情况,排除负载过高的问题。
4.调整文件系统:可以采用ext4文件系统代替ext3文件系统,
以提高磁盘读写速度。
5.优化磁盘读写:可以通过调整系统缓存、调整磁盘调度算法、
替换硬盘为SSD等方式提高磁盘读写速度,减少IO等待时间。
6.优化网络连接:通过优化网络带宽、调整TCP/IP参数、升级
驱动程序等方式提高网络连接,对于负载高的站点特别有效。
7.更新软件和补丁:定期更新系统和软件补丁,以修复漏洞,提
高系统的安全性和稳定性。
8.安全加固:通过关闭不必要的服务和端口,设置安全策略、使
用防火墙等手段加强系统的安全性。
9.资源分配策略:根据系统的使用情况,采用适当的资源分配策
略(如动态分配)提高系统的性能和使用效率。
10.使用高效的编译器:使用最新版本的编译器,对代码进行优化,减少程序的运行时间和占用资源。
linux 参数
linux 参数Linux参数是指在Linux操作系统中,用于控制系统运行的参数设置。
这些参数可以控制系统的性能、安全性、可靠性等方面,对于系统管理员和开发人员来说,了解和掌握这些参数是非常重要的。
一、Linux参数的分类Linux参数主要分为内核参数和应用程序参数两类。
1. 内核参数内核参数是Linux系统内核的参数,主要用于控制系统的性能和安全性。
内核参数可以在系统启动时通过修改启动脚本来设置,也可以通过sysctl命令来动态修改。
常见的内核参数包括:(1)网络参数:如tcp_max_syn_backlog、tcp_syncookies等,用于控制网络连接的建立和传输。
(2)文件系统参数:如inode、file-max等,用于控制文件系统的性能和可靠性。
(3)内存参数:如swappiness、vm.max_map_count等,用于控制内存的使用和分配。
(4)安全参数:如kernel.exec-shield、kernel.randomize_va_space等,用于提高系统的安全性。
2. 应用程序参数应用程序参数是指应用程序自身的参数设置,主要用于控制应用程序的性能和行为。
应用程序参数通常在应用程序的配置文件中进行设置,也可以在启动应用程序时通过命令行参数来设置。
常见的应用程序参数包括:(1)数据库参数:如innodb_buffer_pool_size、max_connections等,用于控制数据库的性能和可靠性。
(2)Web服务器参数:如max_clients、keepalive_timeout等,用于控制Web服务器的性能和并发连接数。
(3)应用程序参数:如log_level、debug_mode等,用于控制应用程序的日志输出和调试模式。
二、Linux参数的设置和修改Linux参数的设置和修改主要有两种方式:手动修改配置文件和使用工具修改。
1. 手动修改配置文件手动修改配置文件是一种常见的设置和修改Linux参数的方式,通常需要编辑相应的配置文件来修改参数的值。
Linux系统性能调优脚本
Linux系统性能调优脚本Linux系统是一种常用的操作系统,它具有开放源代码的特点,使得用户可以自由地进行定制和优化。
为了提高系统的性能,我们可以使用脚本进行调优。
本文将介绍一些常用的Linux系统性能调优脚本,帮助您优化系统并提升其性能。
一、检测系统性能瓶颈的脚本1. vmstat 脚本:vmstat 是一个常用的性能分析工具,可以显示系统的虚拟内存、进程、磁盘、CPU 等各方面的性能信息。
通过编写脚本,在一段时间内持续运行 vmstat 命令,并将结果输出到日志文件中,我们可以分析系统的性能瓶颈所在,并采取相应的优化措施。
2. top 脚本:top 是一个交互式的进程查看工具,可以实时显示系统的进程状态、CPU 使用率、内存使用情况等。
编写脚本将 top 的输出结果保存到日志文件中,可以帮助我们了解系统中的资源占用情况,找出性能瓶颈。
二、优化系统资源的脚本1. 清理内存脚本:Linux系统会将一部分内存用于缓存,而过多的缓存会影响系统的性能。
编写脚本可以定期清理不必要的缓存,释放内存资源,提高系统的响应速度。
2. 禁用不必要的服务脚本:在Linux系统中,可能会存在一些不需要的服务,默认情况下这些服务都会启动,占用系统资源。
编写脚本可以检测并禁用这些不必要的服务,从而释放系统资源,提升性能。
三、优化磁盘写入性能的脚本1. IO调度算法脚本:Linux系统中提供了多种IO调度算法,可以根据实际需求选择适合的算法来优化磁盘的读写性能。
编写脚本可以自动设置合适的IO调度算法,提高磁盘的性能。
2. 优化磁盘读写缓存脚本:在Linux系统中,可以通过调整磁盘的读写缓存大小来提高IO性能。
编写脚本可以自动设置合适的缓存大小,加速磁盘的读写操作,从而提升系统的整体性能。
四、优化网络性能的脚本1. 设置最大文件打开数脚本:Linux系统中,每个进程可以打开的文件数是有限制的。
如果系统中同时运行了大量的进程,并且每个进程都打开了大量的文件,则可能导致系统的性能下降。
out of memory解决方法 linux -回复
out of memory解决方法linux -回复解决Linux中的"out of memory"问题当你在使用Linux系统时,有时可能会遇到"out of memory"(内存不足)的错误。
这种错误会导致系统的性能下降甚至系统崩溃。
为了帮助解决这个问题,本文将一步一步回答如何解决Linux中的"out of memory"问题。
第一步:确定内存问题的根源在你开始解决"out of memory"问题之前,需要先确定问题的根源是什么。
有几种可能的原因会导致内存不足,例如:1. 软件程序占用了大量内存:有些程序可能在运行时会占用过多的内存,导致系统无法分配给其他程序足够的内存资源。
2. 内存泄漏:某些程序可能存在内存泄漏的问题,即它们在运行时无法释放已使用的内存,最终导致系统内存不足。
3. 进程过载:系统中运行的进程数量过多,导致系统无法为每个进程都分配足够的内存。
4. 系统配置不当:如果系统的内存配置不合理,例如分配给内核的内存过小,也会导致内存不足的问题。
通过观察系统日志、性能监控工具以及分析正在运行的程序,你可以进一步确定内存问题的根源。
第二步:优化内存使用一旦确定了内存问题的原因,接下来就需要采取一些措施来优化内存使用。
以下是一些可以尝试的优化方法:1. 关闭不必要的程序:首先,关闭可能正在运行但你不需要的程序。
这些程序可能占用了大量的内存资源,关闭它们可以为其他程序释放出内存。
2. 减少内存占用量大的程序的资源使用:对于某些占用内存较多的程序,你可以尝试调整它们的配置,例如减少某些功能的使用或降低其使用的内存限制。
这样可以减少内存使用量,并让更多的内存可用给其他程序使用。
3. 优化代码:如果你是软件程序的开发者,可以尝试优化代码,减少内存使用。
例如,可以使用更高效的数据结构或算法,释放不再需要的内存等。
4. 调整内存分配策略:通过调整系统的内存分配策略,可以确保每个程序都能够得到足够的内存资源。
为什么你的Linux系统运行速度慢大优化技巧助你提速
为什么你的Linux系统运行速度慢大优化技巧助你提速为什么你的Linux系统运行速度慢? 大优化技巧助你提速作为一种主流的操作系统,Linux在安全性、稳定性和可定制性方面都具有优势。
然而,有时候我们可能会遇到Linux系统运行速度慢的问题。
本文将探讨可能导致系统运行缓慢的原因,并介绍一些大优化技巧,帮助你提高Linux系统的运行速度。
首先,让我们来看一下可能导致Linux系统运行缓慢的一些常见问题:1. 资源占用:过多的后台进程和服务可能会消耗过多的系统资源,导致系统变慢。
你可以使用系统监视工具(如top和htop)来查看当前运行的进程,并根据需要进行关闭或优化。
2. 硬件配置不足:如果你的计算机硬件资源有限,例如内存(RAM)或处理器(CPU)较低,那么你可能会经常遇到系统运行缓慢的问题。
考虑升级硬件或使用更轻量级的Linux发行版来提高性能。
3. 磁盘空间不足:当你的磁盘空间接近满时,系统可能会变得缓慢或不稳定。
确保你有足够的可用磁盘空间,并定期清理或重新分配磁盘空间。
接下来,让我们介绍一些大优化技巧,以帮助你提高Linux系统的运行速度:1. 禁用不需要的服务和进程:检查并禁用你不需要的服务和进程,以减少资源消耗。
你可以使用系统管理工具(如systemd或SysVinit)来管理服务的启动。
2. 使用轻量级的桌面环境:如果你使用的是图形界面的Linux发行版,并且觉得系统运行缓慢,考虑切换到更轻量级的桌面环境,例如Xfce或LXDE。
这些桌面环境通常消耗较少的系统资源,可以提高系统的响应速度。
3. 调整系统内核参数:优化Linux内核参数可以提高系统性能。
你可以编辑/sys/目录下的相关文件,修改参数值。
然而,在修改参数之前,请确保你了解其含义和可能带来的影响。
4. 使用高效的文件系统:选择适合你的需求的高效文件系统。
一些常见的高效文件系统包括Ext4和XFS。
这些文件系统具有更好的性能和更快的文件访问速度。
out of memory解决方法 linux
out of memory解决方法 linux Out of Memory (OOM),即内存不足,是指在计算机运行过程中,当系统无法分配足够的可用内存资源来满足正在运行的程序或进程的需求时所产生的错误。
在Linux操作系统中,Out of Memory错误是比较常见的问题,特别是在运行占用大量内存的应用程序或者同时运行多个应用程序的情况下。
以下是一些解决Out of Memory问题的方法:1.增加物理内存:如果系统内存不足,最直接的解决方法就是增加物理内存。
通过插入更大容量的内存条或者安装额外的内存模块来提高系统的内存容量。
这样可以有效地减少Out of Memory错误的出现。
2.优化内存使用:在Linux系统中,可以通过一些工具来监测和优化内存的使用情况。
例如,使用top命令可以查看系统中当前内存使用情况。
如果存在某个程序或进程占用过多内存,可以考虑调整其内存使用设置或者根据需求进行优化。
3.调整内存分配策略:Linux系统中提供了一些内存分配策略的参数,可以通过调整这些参数来优化内存分配。
例如,可以修改swappiness参数来控制内存交换(swap)的使用比例,以及调整vm.overcommit_memory参数来改变进程的内存分配策略。
4.使用虚拟内存:虚拟内存是一种将磁盘空间作为辅助内存使用的技术。
可以通过调整虚拟内存的大小,将一部分磁盘空间用作内存的扩展,从而增加系统的可用内存。
但是过度依赖虚拟内存可能会导致性能下降,因此需要谨慎调整虚拟内存的大小。
5.限制进程的内存使用:对于特定的进程,可以通过设置内存限制来控制其使用的内存量。
Linux系统中的ulimit命令可以用来设置进程的资源限制,包括内存限制。
通过限制进程的内存使用,可以避免其中某个进程占用过多的内存资源,从而降低Out of Memory错误的发生概率。
6.关闭不必要的进程或服务:有时候在系统中运行一些不必要的进程或服务会占用大量的内存资源。
Linux内存子系统及常用调优参数
Linux内存⼦系统及常⽤调优参数内存⼦系统组件: slab allocator buddy system kswapd pdflush mmu虚拟化环境: PA --> HA --> MA 虚拟机转换:PA --> HA GuestOS, OS Shadow PT 影⼦页表Memory: TLB: 提升性能Hugetable pageHugetlbfs support is built on top of multiple page size support that is provided by most modern architectures(使⽤多种不同的页⾯⼤⼩)Users can use the huge page support in Linux kernel by either using the mmap system call or standard Sysv shared memory system calls(shmget,shamat)cat /proc/meminfo | grep HugePageTuning TLB performanceCheck size of hugepages(检查⼤页⾯) x86info -a | grep "Data TLB"(x86平台查看) dmesg cat /proc/meminfoEnable hugepages(启⽤⼤页⾯) In /etc/sysctl.conf(编辑sysctl.conf配置⽂件) vm.nr_hugepages=n(启⽤⼏个⼤页⾯) Kernel parameter(向内核传递参数) hugepages=n(n⼤页⾯个数)Configure hugetlbfs if needed by application mmap system call requires that hugetlbfs is mounted mkdir /hugepagws mount -t hugetlbfs none /hugepages(挂载内存⼤页⾯) shmat add shmget system calls do not require hugetlbfsViewing system calls(查看系统调⽤)Trace every system call made by a programstrace -o /tmp/strace.out -p PID(追中进程系统调⽤以后输出到strace.out⽂件中)grep mmap /tmp/strace.outSummarize system calls(系统调⽤总结)strace -c -p PID or(观察执⾏那些系统调⽤)strace -c COMMANDOther uses Investigate locak contentions Identify problems caused by improper file permissions Pinpoint IO problemsstrace: strace COMMAND:查看命令的syscal系统调⽤ strace -p PID:查看已启动进程的syscal系统调⽤ -c:只输出其概况信息; -o FILE: 将追踪结果保存⾄⽂件中,以供后续分析使⽤;Strategies for using memory(使⽤内存测试)Reduce overhead for tiny memory objects(降低微⼩内存对象开销) Slab cacheReduce or defer service time for slower subsystems(降低延迟慢速⼦系统的时间共享内存) Filesystem metadata:buffer cache(slab cache)(提供buffer和cache) Disk IO:page cache(磁盘i/o使⽤page cache) Interprocess communications:shared memory(在进程间通信尽可能使⽤) Network IO:buffer cache,arp cache,connection tracking(⽹络io⽐较慢借助buffer cache,arp cache以及连接追踪等功能)Considerations when tuning memory How should pages be reclaimed to avoid pressure? Larger writes are usually more effcient due to re-sortingSlabThe slab memory cache contains per-allocated memory pools that the kernel pulls memory from when it needs space to store various types of data structures1、降低微型内存对象的系统开销 slab2、缩减慢速⼦系统的服务时间 使⽤buffer cache缓存⽂件源数据; 使⽤page cache缓存DISK IO数据; 使⽤shm完成进程间通信; 使⽤buffer cache、arp cache和connetion tracking提升⽹络IO性能;Tuning page allocation(调整页⾯分配)Set usingvm.min_free_kbytes(最⼩空闲kb数,有关内核的内存参数) Tuning vm.min_free_kbytes only be necessary when an application regularly needs to allocate a large block of memory,then frees that same memory It may well be the case that the system has too little disk bandwidth,too little CPU power, or too little memory to handle its load Consequences Reduces service time for demand paging Memory is not available for other useage Can canuse pressure on ZONE_NORMALTuning overcommit(调整内存过量使⽤)Set usingvm.overcommit_memory(虚拟内存参数,是不是能过量使⽤) 0 = heuristic overcommit(启发式过量,什么时候使⽤交换内存以及使⽤多⼤交换内存) 1 = always overcommit(总是过量,总是使⽤交换内存,在数据库服务尽可能不使⽤swap,太慢了) 2 = commit all RAM plus a percentage of swap (may be > 100)(所有物理内存加上⼀部分swap,所⽤的空间是⼤于物理内存的) vm.overcommit_ratio(可以超出物理内存百分之多少,只有vm.overcommit_memory设定为2才有意义,⼀般建议不要超出50%) Specified the percentage of physical memory allowed to be overcommited when the vm.overcommit_memory is set to 2View Committed_AS in /proc/meminfo An estimate of how much RAM is required to avoid an out of memory(OOM) condition for the current workload on a system(千万不能超出物理内存加上swap内存总体⼤⼩,会导致内存溢出的)过量使⽤: 2, 2, 2, 2: 8物理内存的过量使⽤是以swap为前提的: 超出物理内存⼀部分: Swap2.5GSlab cache(调优slab cache)Tiny kernel objects are stored in the slab Extra overhead of tracking is better than using 1 page/object Example: filesystem metadata(dentry and inode caches)Monitoring /proc/slabinfo slabtop(监控slab使⽤状况) vmstat -mTuning a particular slab cache echo "cache_name limit batchcount shared" > /proc/slabinfo limit the maximum number of objects that will be cached for each CPU(最⼤对象数⽬,可以被cpu缓存的最⼤数) batchcount the maximum number of global cache objects that will be transferred to the per-CPU cache when it becomes empty(最⼤数量全局缓存对象最多有多少能够实现在cpu之间传送的) shared the sharing behavior for Symmetric MultProcessing(SMP) systems(在对称多处理器架构当中在各CPU之间可以共享多少个slab cache)调⼤slab cache可以提⾼cpu访问内存⼩对象性能;ARP cacheARP entries map hardware addresses to protocol addresses Cached in /proc/net/arp By default,the cache is limited to 512 entries as a soft limit and 1024 entries as a hard limit(arp最多能缓存512个条⽬,软限制,最⼤⽀持1024个) Garbage collecton removes staler or older entries(移除超出过期的条⽬)Insufficient ARP cache leads to Intermittent timeouts between hosts ARP thrashingToo much ARP cache puts pressure on ZONE_NORMALList entriesip neighbor list(查看arp缓存表)Flush cacheip neighbor flush dev ethX(清空某个⽹卡的arp缓存表)Tuning ARP cacheAdjust where the gc will leave arp table alone(什么时候gc回收器可以让arp表延时)net.ipv4.neigh.default.gc_thresh1 default 128(当条⽬少于128个时候,⾥⾯⽆论有多少条⽬,⽆论这些条⽬是否过期都不管,也不会⾃动清理的)Soft upper limit(软限制)net.ipv4.neigh.default.gc_thresh2 default 512 Becomes hard limit after 5 seconds(清理超出的和过期的)Hard upper limit(硬限制)net.ipv4.neigh.default.ge_thresh3Garbage collection frequency in secondsnet.ipv4.neigh.default.gc_intervalPage cache(页缓存,为了加速读操作的)A large percentage of paging activity is due to I/O(页缓存主要降低磁盘IO) File reads: each page of file read from disk into memory(减少⽂件读取所依赖的磁盘IO,将⽂件读取过来缓存到内存当中,多次访问同⼀个⽂件的时候就直接在内存中进⾏访问了) These pages form the page cache(这些页⾯主要来⾃page cache的)Page cache is always checked for IO requests(如何实现降低IO请求的) Directory reads(缓存⽬录读取) Reading and writing regular files(普通⽂件读写都可以使⽤page cache) Reading and writing via block device files,DISK IO(读和写是通过块设备的disk io来实现) Accessing memory mapped files,mmap(内存映射) Accessing swapped out pages(将⼀些页⾯到交换分区)Pages in the page cache are associated with file dataTuning page cache(调整page cache)View page cache allocation in /proc/meminfoTune length/size of memoryvm.lowmen_reserve_ratio(当内存很底预留的⽐例)vm.vfs_cache_pressureTune arrival/completion ratevm.page-clustervm.zone_reclaim_modevm.lowmen_reserve_ratio(低端内存预留多少空间) For some specialised workloads on highmem machines it is dangerous for the kernel to allow process memory to be allocated from the "lowmem" zone Linux page allocator has a mechanism which prevents allocations which could use highmem from using too much lowmem The 'lowmem_reserve_ratio'tunable determines how aggressive how aggressive the kernel is in defending these lower zones If you have a machine which uses highmem or ISA DMA and your applications are using mlock(),or if you are running with no swap then you probably should change the lowmem_reserve_ratio settingvfs_cache_pressure(虚拟⽂件系统缓存) Controls the tendency of the kernel to reclaim the memory which is used for caching of directory and inode objects(控制内核回收内存的趋势,内核在什么场景下回收⽤于缓存⽬录⼀级inode对象的内存占⽤空间) At the default value of vfs_cache_pressure=100 the kernel will attempt to reclaim dentries and inodes at a "fair" rate with respect to pagecache and swapcache reclaim(默认为100,使⽤⼀种公平的策略相对于pagecache和swapcache⽽⾔,所以只要能够回收pagecache,它就能够回收dentries) Decreasing vfs_cache_pressure causes the kernel to prefer to retain dentry and inode caches(降低这个值会导致内核不倾向回收这directory和inode) When vfs_cache_pressure=0,the kernel will never reclaim dentries and inodes due to memory pressure and this can easily lead to out-of-memory conditions(等于0绝对不会回收directory和inode,这有可能导致内存溢出的) Increasing vfs_cache_pressure beyond 100 causes the kernel to prefer to reclaim dentries and inodes(⼤于100更倾向于回收directory和inode)vfs_cache_pressure: 0: 不回收dentries和innodes; 1-99: 倾向于不回⾸dentries和innodes; 100: 倾向于page cache和swap cache相同; 100+:倾向于回收;page-cluster(页⾯簇,需要将数据从内存放到交换内存⼀次拿多少页⾯) page-cluster controls the number of pages which are written to swap in a single attempt It is a logarithmic value - setting it to zero means "1 page", setting it to 1 means "2 pages",setting it to 2 means "4 pages", etc The default value is three(eight pages at a time) There may be some small benefits in tuning this to a different value if your workload is swap-intensivezone_reclaim_mode(更倾向于回收那⼀段内存) Zone_reclaim_mode allows someone to set more or less aggressive approaches to reclaim memory when a zone runs out of memory If it is set to zero then no zone reclaim occurs Allocations will be satisfied from other zones / nodes in the system Tis is value ORed together of 1 = Zone reclaim on(打开内存区域回收) 2 = Zone reclaim writes dirty pages out(回收写操作脏页) 4 = Zone reclaim swaps pages(回收⽤于swaps的页⾯)Anonymous pages(匿名页,通常⾥⾯没有包含⽂件内容)Anonymous pages can be another large consumer of dataAre not associated with a file,but instead contain: Program data-arrays,heap allocations,etc(程序⾃⾝产⽣数据) Anonymous memory regions(匿名内存区域) Dirty memory mapped process private pages(脏内存页⾯,有进程私有页⾯)IPC shared memory region pages(进程间通信的共享页⾯)View summary usagegrep Anon /proc/meminfocat /proc/PID/stamAnonymous pages=RSS-Shared(匿名页⼤⼩)Anonymous pages are eligible for swap匿名也不能被交换出去额,只有两个进程要交换数据才需要⽤到共享内存;[root@Smoke ~]# cat /proc/meminfo | grep -i Huge(查看meminfo⽂件内容将结果送给管道只显⽰Huge相关)HugePages_Total: 0(没有启⽤⼤页⾯)HugePages_Free: 0HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kB(⼤页⾯⼤⼩2M)提⽰:64位系统它所⽀持的格式⽐32位系统要多⼀些,32位⼩页⾯只有4K,⼤页⾯只有4M,⽽对于64位系统可能略有不同;[root@Smoke ~]# sysctl -w vm.nr_hugepages=10(改变内核运⾏参数,向内核传递参数⼤页⾯个数为10)vm.nr_hugepages = 10[root@Smoke ~]# cat /proc/meminfo | grep -i Huge(查看meminfo⽂件内容将结果送给管道只显⽰Huge相关)HugePages_Total: 10(10个⼤页⾯)HugePages_Free: 10(空闲10个没使⽤)HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kB提⽰:当创建⼤页⾯以后可以指定可以被那些应⽤程序可以使⽤,甚⾄我们也可以把⼤页⾯当作⼀个⽂件系统来直接使⽤,可以把它挂载到某个⽬录当作⽂件系统来⽤;[root@Smoke ~]# mkdir /hugepages(创建hugepages⽬录)[root@Smoke ~]# mount -t hugetlbfs none /hugepages/(挂载内存⼤页⾯⽂件系统到/hugepages⽬录)[root@Smoke ~]# ls /hugepages/(查看/hugepages⽬录)[root@Smoke ~]# dd if=/dev/zero of=/hugepages/a.test bs=1M count=5(从/dev/zero复制到a.test⽂件,⼤⼩为1M,总共复制5个)dd: 正在写⼊"/hugepages/a.test": ⽆效的参数记录了1+0 的读⼊记录了0+0 的写出0字节(0 B)已复制,0.0026437 秒,0.0 kB/秒[root@Smoke ~]# ll /hugepages/(查看/hugepages⽬录⽂件及⼦⽬录)总⽤量 0-rw-r--r--. 1 root root 0 6⽉ 23 16:21 a.test提⽰:⼤⼩为0,因为这⾥是内存;[root@Smoke ~]# ll -h /hugepages/(查看/hugepages⽬录⽂件及⼦⽬录详细信息,并做单位换算)总⽤量 0-rw-r--r--. 1 root root 0 6⽉ 23 16:21 a.test[root@Smoke ~]# cp /etc/issue /hugepages/(复制issue⽂件到/hugepages⽬录)cp: writing `/hugepages/issue': Invalid argument提⽰:不允许直接使⽤得让某个应⽤程序使⽤;[root@Smoke ~]# umount /hugepages(卸载/hugepages⽬录⽂件系统)[root@Smoke ~]# ps aux(以寄存器格式显⽰所有中断所有⽤户进程)USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 2900 1436 ? Ss 15:05 0:01 /sbin/initroot 2 0.0 0.0 0 0 ? S 15:05 0:00 [kthreadd]root 3 0.0 0.0 0 0 ? S 15:05 0:00 [migration/0]root 4 0.0 0.0 0 0 ? S 15:05 0:00 [ksoftirqd/0]root 5 0.0 0.0 0 0 ? S 15:05 0:00 [migration/0]root 6 0.0 0.0 0 0 ? S 15:05 0:02 [watchdog/0]root 7 0.0 0.0 0 0 ? S 15:05 0:00 [events/0]root 8 0.0 0.0 0 0 ? S 15:05 0:00 [cgroup]root 9 0.0 0.0 0 0 ? S 15:05 0:00 [khelper]root 10 0.0 0.0 0 0 ? S 15:05 0:00 [netns]root 11 0.0 0.0 0 0 ? S 15:05 0:00 [async/mgr]root 12 0.0 0.0 0 0 ? S 15:05 0:00 [pm]root 13 0.0 0.0 0 0 ? S 15:05 0:00 [sync_supers]root 14 0.0 0.0 0 0 ? S 15:05 0:00 [bdi-default]root 15 0.0 0.0 0 0 ? S 15:05 0:00 [kintegrityd/0]root 16 0.0 0.0 0 0 ? S 15:05 0:02 [kblockd/0]root 17 0.0 0.0 0 0 ? S 15:05 0:00 [kacpid]root 18 0.0 0.0 0 0 ? S 15:05 0:00 [kacpi_notify]root 19 0.0 0.0 0 0 ? S 15:05 0:00 [kacpi_hotplug]root 20 0.0 0.0 0 0 ? S 15:05 0:00 [ata/0]root 21 0.0 0.0 0 0 ? S 15:05 0:00 [ata_aux]root 22 0.0 0.0 0 0 ? S 15:05 0:00 [ksuspend_usbd]root 23 0.0 0.0 0 0 ? S 15:05 0:00 [khubd]root 24 0.0 0.0 0 0 ? S 15:05 0:00 [kseriod]root 25 0.0 0.0 0 0 ? S 15:05 0:00 [md/0]root 26 0.0 0.0 0 0 ? S 15:05 0:00 [md_misc/0]root 27 0.0 0.0 0 0 ? S 15:05 0:00 [khungtaskd]root 28 0.0 0.0 0 0 ? S 15:05 0:00 [kswapd0]root 29 0.0 0.0 0 0 ? SN 15:05 0:00 [ksmd]root 30 0.0 0.0 0 0 ? S 15:05 0:00 [aio/0]root 31 0.0 0.0 0 0 ? S 15:05 0:00 [crypto/0]root 36 0.0 0.0 0 0 ? S 15:05 0:00 [kthrotld/0]root 37 0.0 0.0 0 0 ? S 15:05 0:00 [pciehpd]root 39 0.0 0.0 0 0 ? S 15:05 0:00 [kpsmoused]root 40 0.0 0.0 0 0 ? S 15:05 0:00 [usbhid_resumer]root 210 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_0]root 212 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_1]root 218 0.0 0.0 0 0 ? S 15:05 0:00 [mpt_poll_0]root 219 0.0 0.0 0 0 ? S 15:05 0:00 [mpt/0]root 220 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_2]root 238 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_3]root 239 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_4]root 240 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_5]root 241 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_6]root 242 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_7]root 243 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_8]root 244 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_9]root 245 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_10]root 246 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_11]root 247 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_12]root 248 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_13]root 249 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_14]root 250 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_15]root 251 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_16]root 252 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_17]root 253 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_18]root 254 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_19]root 255 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_20]root 256 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_21]root 257 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_22]root 258 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_23]root 259 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_24]root 260 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_25]root 261 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_26]root 262 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_27]root 263 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_28]root 264 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_29]root 265 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_30]root 266 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_31]root 267 0.0 0.0 0 0 ? S 15:05 0:00 [scsi_eh_32]root 372 0.0 0.0 0 0 ? S 15:05 0:00 [kjournald]root 451 0.0 0.0 2692 988 ? S<s 15:05 0:00 /sbin/udevd -droot 626 0.0 0.0 0 0 ? S 15:05 0:00 [vmmemctl]root 649 0.0 0.0 0 0 ? S 15:05 0:02 [flush-8:0]root 714 0.0 0.0 0 0 ? S 15:05 0:00 [bluetooth]root 782 0.0 0.0 0 0 ? S 15:05 0:00 [kstriped]root 811 0.0 0.0 0 0 ? S 15:05 0:00 [kjournald]root 849 0.0 0.0 0 0 ? S 15:05 0:00 [kauditd]root 1049 0.0 0.0 12932 812 ? S<sl 15:05 0:00 auditdroot 1065 0.0 0.0 35972 1512 ? Sl 15:05 0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5dbus 1078 0.0 0.0 13244 1048 ? Ssl 15:05 0:00 dbus-daemon --systemroot 1111 0.0 0.0 8576 1028 ? Ss 15:05 0:00 /usr/sbin/sshdroot 1187 0.0 0.1 12524 2520 ? Ss 15:05 0:00 /usr/libexec/postfix/masterroot 1195 0.0 0.0 7080 1272 ? Ss 15:05 0:00 crondpostfix 1202 0.0 0.1 12668 2512 ? S 15:05 0:00 qmgr -l -t fifo -uroot 1210 0.0 0.0 6156 668 ? Ss 15:05 0:00 /usr/bin/rhsmcertdroot 1224 0.0 0.0 2008 508 tty1 Ss+ 15:05 0:00 /sbin/mingetty /dev/tty1root 1226 0.0 0.0 2008 508 tty2 Ss+ 15:05 0:00 /sbin/mingetty /dev/tty2root 1228 0.0 0.0 2008 508 tty3 Ss+ 15:05 0:00 /sbin/mingetty /dev/tty3root 1230 0.0 0.0 2008 508 tty4 Ss+ 15:05 0:00 /sbin/mingetty /dev/tty4root 1233 0.0 0.0 3348 1872 ? S< 15:05 0:00 /sbin/udevd -droot 1234 0.0 0.0 3348 1792 ? S< 15:05 0:00 /sbin/udevd -droot 1235 0.0 0.0 2008 512 tty5 Ss+ 15:05 0:00 /sbin/mingetty /dev/tty5root 1237 0.0 0.0 2008 512 tty6 Ss+ 15:05 0:00 /sbin/mingetty /dev/tty6root 1301 0.0 0.1 11652 3336 ? Rs 15:57 0:02 sshd: root@pts/0root 1305 0.0 0.0 6852 1804 pts/0 Ss 15:57 0:00 -bashpostfix 1395 0.0 0.1 12600 2472 ? S 16:45 0:00 pickup -l -t fifo -uroot 1539 0.0 0.1 11200 3236 ? Ss 16:56 0:00 /usr/sbin/httpdapache 1541 0.0 0.1 11200 2072 ? S 16:56 0:00 /usr/sbin/httpdapache 1542 0.0 0.1 11200 2072 ? S 16:56 0:00 /usr/sbin/httpdapache 1543 0.0 0.1 11200 2072 ? S 16:56 0:00 /usr/sbin/httpdapache 1544 0.0 0.1 11200 2072 ? S 16:56 0:00 /usr/sbin/httpdapache 1545 0.0 0.1 11200 2072 ? S 16:56 0:00 /usr/sbin/httpdapache 1546 0.0 0.1 11200 2072 ? S 16:56 0:00 /usr/sbin/httpdapache 1547 0.0 0.1 11200 2072 ? S 16:56 0:00 /usr/sbin/httpdapache 1548 0.0 0.1 11200 2072 ? S 16:56 0:00 /usr/sbin/httpdroot 1549 0.0 0.0 4904 1000 pts/0 R+ 16:56 0:00 ps aux[root@Smoke ~]# strace -p 1541(查看1541进程产⽣的系统调⽤)Process 1541 attached - interrupt to quitaccept(4,提⽰:现在被阻塞了,因为当前http进程没有接收任何请求,当接收请求这⾥就会产⽣系统调⽤,如果⽤户请求⼀个页⾯⽂件,这个页⾯⽂件在我们主机上,当前系统必须要打开这个页⾯,要打开页⾯⽂件必须要跟硬件打交道,所以必须实现系统调⽤;[root@Smoke ~]# cp /etc/fstab /var/www/html/index.html(复制fstab到/var/www/html叫index.html)[root@Smoke ~]# ab -n 200 -c 10 http://172.16.100.106/index.html(http压⼒测试,-n请求总数,-c⼀次多少请求)This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, /Licensed to The Apache Software Foundation, /Benchmarking 172.16.100.106 (be patient)Completed 100 requestsCompleted 200 requestsFinished 200 requestsServer Software: Apache/2.2.15Server Hostname: 172.16.100.106Server Port: 80Document Path: /index.htmlDocument Length: 805 bytesConcurrency Level: 10Time taken for tests: 0.131 secondsComplete requests: 200Failed requests: 0Write errors: 0Total transferred: 221450 bytesHTML transferred: 165830 bytesRequests per second: 1529.84 [#/sec] (mean)Time per request: 6.537 [ms] (mean)Time per request: 0.654 [ms] (mean, across all concurrent requests)Transfer rate: 1654.21 [Kbytes/sec] receivedConnection Times (ms)min mean[+/-sd] median maxConnect: 1 3 1.2 3 7Processing: 1 3 1.2 3 7Waiting: 0 3 1.4 2 7Total: 4 6 1.4 6 10Percentage of the requests served within a certain time (ms)50% 666% 775% 780% 790% 895% 998% 999% 9100% 10 (longest request)[root@Smoke ~]# strace -p 1541(查看1541进程产⽣的系统调⽤)Process 1541 attached - interrupt to quitaccept(4, {sa_family=AF_INET6, sin6_port=htons(46057), inet_pton(AF_INET6, "::ffff:172.16.100.106", &sin6_addr), sin6_flowinfo=0, sin6_sc ope_id=0}, [28]) = 10fcntl64(10, F_GETFD) = 0fcntl64(10, F_SETFD, FD_CLOEXEC) = 0getsockname(10, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:172.16.100.106", &sin6_addr), sin6_flowinfo=0, sin6 _scope_id=0}, [28]) = 0fcntl64(10, F_GETFL) = 0x2 (flags O_RDWR)fcntl64(10, F_SETFL, O_RDWR|O_NONBLOCK) = 0read(10, "GET /index.html HTTP/1.0\r\nHost: "..., 8000) = 92gettimeofday({1466672824, 957795}, NULL) = 0stat64("/var/www/html/index.html", {st_mode=S_IFREG|0644, st_size=805, ...}) = 0open("/var/www/html/index.html", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 11fcntl64(11, F_GETFD) = 0x1 (flags FD_CLOEXEC)fcntl64(11, F_SETFD, FD_CLOEXEC) = 0setsockopt(10, SOL_TCP, TCP_CORK, [1], 4) = 0writev(10, [{"HTTP/1.1 200 OK\r\nDate: Thu, 23 J"..., 270}], 1) = 270sendfile64(10, 11, [0], 805) = 805setsockopt(10, SOL_TCP, TCP_CORK, [0], 4) = 0write(7, "172.16.100.106 - - [23/Jun/2016:"..., 105) = 105shutdown(10, 1 /* send */) = 0poll([{fd=10, events=POLLIN}], 1, 2000) = 1 ([{fd=10, revents=POLLIN|POLLHUP}])read(10, "", 512) = 0close(10) = 0[root@Smoke ~]# strace cat /etc/fstab(cat命令所产⽣的系统调⽤)execve("/bin/cat", ["cat", "/etc/fstab"], [/* 24 vars */]) = 0brk(0) = 0x97ab000mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb776d000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)open("/etc/ld.so.cache", O_RDONLY) = 3fstat64(3, {st_mode=S_IFREG|0644, st_size=24851, ...}) = 0mmap2(NULL, 24851, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7766000close(3) = 0open("/lib/libc.so.6", O_RDONLY) = 3read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@n\1\0004\0\0\0"..., 512) = 512fstat64(3, {st_mode=S_IFREG|0755, st_size=1902708, ...}) = 0mmap2(NULL, 1665416, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x124000mprotect(0x2b4000, 4096, PROT_NONE) = 0mmap2(0x2b5000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x190) = 0x2b5000mmap2(0x2b8000, 10632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b8000close(3) = 0mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7765000set_thread_area({entry_number:-1 -> 6, base_addr:0xb77656c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0mprotect(0x2b5000, 8192, PROT_READ) = 0mprotect(0xb2d000, 4096, PROT_READ) = 0munmap(0xb7766000, 24851) = 0open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3fstat64(3, {st_mode=S_IFREG|0644, st_size=99154448, ...}) = 0mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7565000close(3) = 0brk(0) = 0x97ab000brk(0x97cc000) = 0x97cc000fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3fstat64(3, {st_mode=S_IFREG|0644, st_size=805, ...}) = 0read(3, "\n#\n# /etc/fstab\n# Created by ana"..., 32768) = 805write(1, "\n#\n# /etc/fstab\n# Created by ana"..., 805## /etc/fstab# Created by anaconda on Thu Jun 23 08:08:17 2016## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#UUID=839d0d66-fd15-4f1d-8e9b-bc0721993249 / ext3 defaults 1 1UUID=a4e9c558-055a-4c07-9c86-c755441c5fa5 /boot ext3 defaults 1 2UUID=75d91000-509f-40aa-9407-ca377b5d1066 swap swap defaults 0 0tmpfs /dev/shm tmpfs defaults 0 0devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0) = 805read(3, "", 32768) = 0close(3) = 0close(1) = 0close(2) = 0exit_group(0) = ?[root@Smoke ~]# tty(查看当前所使⽤的终端)/dev/pts/0[root@Smoke ~]# strace -c cat /etc/fstab(查看cat命令所产⽣的系统调⽤,-c追踪整个结果)## /etc/fstab# Created by anaconda on Thu Jun 23 08:08:17 2016## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#UUID=839d0d66-fd15-4f1d-8e9b-bc0721993249 / ext3 defaults 1 1UUID=a4e9c558-055a-4c07-9c86-c755441c5fa5 /boot ext3 defaults 1 2UUID=75d91000-509f-40aa-9407-ca377b5d1066 swap swap defaults 0 0tmpfs /dev/shm tmpfs defaults 0 0devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ----------------100.00 0.000229 229 1 execve0.00 0.000000 0 3 read0.00 0.000000 0 1 write0.00 0.000000 0 4 open0.00 0.000000 0 6 close0.00 0.000000 0 1 1 access0.00 0.000000 0 3 brk0.00 0.000000 0 1 munmap0.00 0.000000 0 3 mprotect0.00 0.000000 0 7 mmap20.00 0.000000 0 5 fstat640.00 0.000000 0 1 set_thread_area------ ----------- ----------- --------- --------- ----------------100.00 0.000229 36 1 total[root@Smoke ~]# cat /proc/slabinfo(查看slabinfo⽂件内容)slabinfo - version: 2.1# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>fib6_nodes 24 59 64 59 1 : tunables 120 60 8 : slabdata 1 1 0ip6_dst_cache 16 30 384 10 1 : tunables 54 27 8 : slabdata 3 3 0ndisc_cache 1 15 256 15 1 : tunables 120 60 8 : slabdata 1 1 0ip6_mrt_cache 0 0 128 30 1 : tunables 120 60 8 : slabdata 0 0 0RAWv6 131 132 1024 4 1 : tunables 54 27 8 : slabdata 33 33 0UDPLITEv6 0 0 1024 4 1 : tunables 54 27 8 : slabdata 0 0 0UDPv6 0 0 1024 4 1 : tunables 54 27 8 : slabdata 0 0 0tw_sock_TCPv6 0 0 320 12 1 : tunables 54 27 8 : slabdata 0 0 0request_sock_TCPv6 0 0 192 20 1 : tunables 120 60 8 : slabdata 0 0 0TCPv6 4 4 1920 2 1 : tunables 24 12 8 : slabdata 2 2 0jbd2_1k 0 0 1024 4 1 : tunables 54 27 8 : slabdata 0 0 0avtab_node 610413 610560 24 144 1 : tunables 120 60 8 : slabdata 4240 4240 0ext4_inode_cache 6678 6684 1000 4 1 : tunables 54 27 8 : slabdata 1671 1671 0ext4_xattr 1 44 88 44 1 : tunables 120 60 8 : slabdata 1 1 0ext4_free_block_extents 0 0 56 67 1 : tunables 120 60 8 : slabdata 0 0 0ext4_alloc_context 0 0 136 28 1 : tunables 120 60 8 : slabdata 0 0 0ext4_prealloc_space 6 37 104 37 1 : tunables 120 60 8 : slabdata 1 1 0ext4_system_zone 0 0 40 92 1 : tunables 120 60 8 : slabdata 0 0 0jbd2_journal_handle 0 0 24 144 1 : tunables 120 60 8 : slabdata 0 0 0jbd2_journal_head 16 34 112 34 1 : tunables 120 60 8 : slabdata 1 1 0jbd2_revoke_table 4 202 16 202 1 : tunables 120 60 8 : slabdata 1 1 0jbd2_revoke_record 0 0 32 112 1 : tunables 120 60 8 : slabdata 0 0 0sd_ext_cdb 2 112 32 112 1 : tunables 120 60 8 : slabdata 1 1 0scsi_sense_cache 4 30 128 30 1 : tunables 120 60 8 : slabdata 1 1 0scsi_cmd_cache 6 15 256 15 1 : tunables 120 60 8 : slabdata 1 1 0dm_raid1_read_record 0 0 1064 7 2 : tunables 24 12 8 : slabdata 0 0 0kcopyd_job 0 0 3240 2 2 : tunables 24 12 8 : slabdata 0 0 0io 0 0 64 59 1 : tunables 120 60 8 : slabdata 0 0 0dm_uevent 0 0 2608 3 2 : tunables 24 12 8 : slabdata 0 0 0dm_rq_clone_bio_info 0 0 16 202 1 : tunables 120 60 8 : slabdata 0 0 0dm_rq_target_io 0 0 392 10 1 : tunables 54 27 8 : slabdata 0 0 0dm_target_io 0 0 24 144 1 : tunables 120 60 8 : slabdata 0 0 0dm_io 0 0 40 92 1 : tunables 120 60 8 : slabdata 0 0 0flow_cache 0 0 104 37 1 : tunables 120 60 8 : slabdata 0 0 0uhci_urb_priv 1 67 56 67 1 : tunables 120 60 8 : slabdata 1 1 0cfq_io_context 27 84 136 28 1 : tunables 120 60 8 : slabdata 3 3 0cfq_queue 26 48 240 16 1 : tunables 120 60 8 : slabdata 3 3 0bsg_cmd 0 0 312 12 1 : tunables 54 27 8 : slabdata 0 0 0mqueue_inode_cache 1 4 896 4 1 : tunables 54 27 8 : slabdata 1 1 0isofs_inode_cache 0 0 640 6 1 : tunables 54 27 8 : slabdata 0 0 0hugetlbfs_inode_cache 1 6 608 6 1 : tunables 54 27 8 : slabdata 1 1 0dquot 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0kioctx 12 20 384 10 1 : tunables 54 27 8 : slabdata 2 2 0kiocb 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0inotify_event_private_data 0 0 32 112 1 : tunables 120 60 8 : slabdata 0 0 0inotify_inode_mark_entry 37 64 120 32 1 : tunables 120 60 8 : slabdata 2 2 0dnotify_mark_entry 0 0 120 32 1 : tunables 120 60 8 : slabdata 0 0 0dnotify_struct 0 0 32 112 1 : tunables 120 60 8 : slabdata 0 0 0dio 0 0 640 6 1 : tunables 54 27 8 : slabdata 0 0 0fasync_cache 0 0 24 144 1 : tunables 120 60 8 : slabdata 0 0 0khugepaged_mm_slot 1 92 40 92 1 : tunables 120 60 8 : slabdata 1 1 0ksm_mm_slot 0 0 48 77 1 : tunables 120 60 8 : slabdata 0 0 0ksm_stable_node 0 0 48 77 1 : tunables 120 60 8 : slabdata 0 0 0ksm_rmap_item 0 0 64 59 1 : tunables 120 60 8 : slabdata 0 0 0utrace_engine 0 0 56 67 1 : tunables 120 60 8 : slabdata 0 0 0utrace 0 0 64 59 1 : tunables 120 60 8 : slabdata 0 0 0pid_namespace 0 0 2168 3 2 : tunables 24 12 8 : slabdata 0 0 0。
linux 内存不足的解决方法
linux 内存不足的解决方法Linux是一种常用的操作系统,广泛应用于服务器和嵌入式设备。
在运行过程中,有时会遇到内存不足的问题。
本文将介绍一些解决Linux内存不足问题的方法。
一、查看内存使用情况我们需要了解当前系统的内存使用情况。
可以使用命令"free -m"来查看当前内存的使用情况。
该命令会显示系统的总内存、已使用的内存、空闲的内存等信息。
通过这些信息,我们可以初步判断是否存在内存不足的问题。
二、释放缓存Linux系统会将一部分内存用作缓存,以提高系统的性能。
但有时候这些缓存占用的内存可能比较大,导致系统内存不足。
我们可以使用命令"echo 1 > /proc/sys/vm/drop_caches"来释放缓存,以腾出一些内存空间。
三、关闭不必要的服务和进程有时候,系统中可能会有一些不必要的服务和进程在后台运行,占用了较多的内存。
我们可以通过命令"systemctl"或"service"来停止或禁用这些服务。
同时,也可以使用"ps"命令查看当前运行的进程,并通过"kill"命令终止一些不必要的进程。
四、调整内存分配如果经过以上的操作,系统仍然存在内存不足的问题,我们可以考虑调整内存的分配。
在Linux中,可以通过修改"/etc/sysctl.conf"文件来调整内存的分配。
其中包括一些参数,如"vm.min_free_kbytes"、"vm.swappiness"等。
通过调整这些参数的值,可以改变系统对内存的使用方式,从而解决内存不足的问题。
五、增加物理内存如果以上的方法都无法解决问题,那么最后的办法就是增加物理内存。
如果是在虚拟机中运行Linux系统,可以通过虚拟机管理工具来增加虚拟机的内存。
如果是在物理服务器上运行Linux系统,可以考虑增加服务器的内存条。
linux 提高内存占用方法
linux 提高内存占用方法
1. 使用swap分区:swap分区是一种虚拟内存空间,可以帮助系统处理内存不足的情况。
可以通过创建和启用swap分区来提高系统的内存占用。
2. 调整内核参数:可以通过调整内核参数来修改系统的内存管理策略,例如修改swappiness值来调整内存和swap的使用比例,或者调整缓存参数来优化内存使用效率。
3. 使用内存优化工具:有一些工具可以协助优化内存占用,例如使用jemalloc来管理内存分配,或者使用zswap来压缩内存页。
4. 限制进程内存使用:可以通过设置ulimit或者cgroups等工具来限制特定进程可以使用的内存大小,从而避免某个进程过度占用内存。
5. 定期释放内存:某些进程可能会在退出后仍然占用内存,可以使用定期清理工具,如sysctl或者手动释放内存。
总的来说,提高Linux系统的内存占用可以通过使用swap分区、调整内核参数、使用内存优化工具、限制进程内存使用以及定期释放内存等方法来实现。
嵌入式Linux操作系统的性能优化研究
嵌入式Linux操作系统的性能优化研究第一章引言作为一种具有高度可定制性和开放性的操作系统,Linux已经成为了嵌入式系统的不二选择。
随着嵌入式系统的不断发展,Linux操作系统也在不断完善和改进。
然而,随着嵌入式应用场景越来越多样化和复杂化,系统性能优化变得尤为重要。
本文将探讨嵌入式Linux操作系统的性能优化研究,包括内存管理、文件系统优化、网络协议栈优化等方面的内容。
第二章内存管理优化在嵌入式系统中,内存管理对于系统稳定性和性能表现至关重要。
一些基本的内存管理优化包括:1.优化内存分配算法。
在分配内存时使用较为高效的算法,能够优化性能。
例如,选用slab内存分配器来进行高速内存分配。
2.减少内存碎片。
内存碎片会浪费宝贵的内存资源,而且会影响数据访问效率。
因此,可以使用一些内存整理和回收算法来减少内存碎片。
例如,在长时间运行后进行一次内存整理操作。
3.优化内存缓存。
在嵌入式系统中,内存缓存对系统性能的影响非常大。
因此,在选择和配置内存缓存时需要慎重考虑。
一些常用的内存缓存优化技术包括“预取机制”、“缓冲机制”等等。
第三章文件系统优化文件系统是操作系统中最常用的资源管理工具之一。
随着嵌入式应用场景的增加,如何优化文件系统已经变成了一个很重要的问题。
一些常见的文件系统优化技术包括:1.选择合适的文件系统。
Linux操作系统中,有许多种文件系统可以选择。
每种文件系统都有其独特的优势和不足。
因此,在选择文件系统时,需要考虑应用场景和性能要求,选择最合适的文件系统。
2.减少磁盘I/O操作。
磁盘I/O操作会耗费大量的时间和资源。
因此,在进行文件读取和写入时,需要尽可能地减少I/O操作的次数。
例如,在进行多个小文件的读写时,可以使用“批量读写”技术,减少I/O操作的次数。
3.使用缓存机制。
在读取和写入文件时,可以使用缓存机制。
缓存机制可以减少磁盘I/O操作的次数,提高系统性能。
例如,可以使用文件系统缓存机制,将常用的文件读取到缓存中,减少I/O 操作的次数。
linux内存占用过高问题解决方法
linux内存占⽤过⾼问题解决⽅法
1. 使⽤top 查看内存的占⽤情况,然后键⼊"M"命令根据内存的占⽤情况降序排列("P"是CPU占⽤情况降序排列)
2.关闭掉不需要的进程,
3.再使⽤top查看内存占⽤情况,发觉内存占⽤率已经降下来了,但是free -g却还有100G被占⽤(内存总共
128G),vmstat发现是cache 占⽤了⼤量内存。
4. 使⽤ echo 1 > /proc/sys/vm/drop_caches 释放缓存
常⽤的释放缓存的命令如下
To free pagecache:仅清除页⾯缓存(PageCache)
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:清除⽬录项和inode
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:清除页⾯缓存,⽬录项和inode
echo 3 > /proc/sys/vm/drop_caches
5.再使⽤free -g 查看内存使⽤情况,发现内存使⽤情况已经正常了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于Linux内存管理
下面是本人对Linux上内存管理问题的观点
1.有很多地方需要占用物理内存:
A)进程及其全部动态库的文本段,数据段
B)动态分配的用户内存(malloc =>mmap)
C)进程所访问文件或块设备的缓存( page cache, buffer cache)
D)进程间共享内存
E)内核文本及数据段(reserved physical memory)
F)内核动态数据结构(kmalloc, slabs )
G)动态加载内核模块(vmalloc)
H)页表占用的物理页(alloc_page)
2. Linux 会对物理内存使用采取延迟释放策略,只有当某一部分(如某应用进程的网络
操作)需要分配物理内存,而当前空闲物理页较少时,才去回收不再使用的物理内存. Linux只需回收足够的物理内存,所以你从cat /proc/meminfo 看到的free memory值可能不是很大,但这并不表示当前系统就缺少物理内存. 从内存回收的角度,我们只需考虑前面提到的A, B, C, D, F 五种内存
3.对于进程虚拟空间中的页如文本段,数据段及malloc=>mmap分配的内存,当
进程exit时,会立即释放; 但对打开文件的缓存页,当文件被close时并不立即释放(因为该文件可能很快被新进程重新打开而使用),而是通过系统的页回收机制进行回收.
4.文件数据所占页中包括cached 和buffer 两类. cached 页是按物理页大小进行
读写的文件数据(4k)的缓存;buffer 页包括按磁盘块大小(如1k)进行读写的文件数据(逻辑页在磁盘上可能不连续),文件系统元数据,直接写块设备的数据等的缓存
5.页回收机制将使用的页分成两类active, inactive,采用类似于LRU(Less
Recently Used )算法进行回收,所以页的变化方式是active <=> inactive => free 回收的页总是最近较少使用的页, 而回收的目的只是需要释放足够的页即可
6.对于malloc=>mmap的页、写过的进程数据段页或共享内存页,被回收时需写到
swap分区暂存起来,因为这些在磁盘上本来就没有存放的位置,可称之为anonymous页
7.用户进程的物理页分配是当进程访问其虚拟页时,系统产生一个page fault 异常,
为该虚拟页映射一个物理页,因此用户进程的物理页总是一页一页地分配的. 对于程序执行中没访问到的虚拟页,可能就没对应的物理页,所以通常看到进程的VirMem会比其ResMem大很多. 另外,系统物理页不够时,物理页的回收也会使ResMem的值减小
8.系统中的物理内存被分成若干个zone,如DMA, NORMAL, HIGHMEM. 每个zone
都有自己的active, inactive物理页队列.每个zone结构的pages_min, pages_low, pages_high 三个字段用来控制物理页的分配和回收. 物理页分配的接口函数为__alloc_pages(),__alloc_pages()的执行过程可用如下几点来描述:
A)__alloc_pages中确定能否分配物理页时,最多可进行三次空闲物理页数目的检查
B)第一次检查时,根据各zone的pages_low的值确定一个标准,如果全部参与分配的
zone的free页数目小于其标准值时,立即唤醒kswapd,进行后台(异步)物理页
回收, 并执行第二次检查;
C)第二次检查时,根据各zone的pages_min的值确定一个标准, 如果全部参与分配的
zone的free页数目小于该标准值时, 则调用try_to_free_pages()执行直接(同步)
物理页回收,随后执行第三次检查
D)第三次检查时,使用的标准和第二次检查时一样,是通过pages_min确定的一个标准
值;如果这次检查失败,则对于通常的内存请求模式来说, 表明__alloc_pages()分配失
败,调用dump_stack(), show_mem() 报告信息
E)如果__alloc_pages()的内存请求模式是__GFP_HIGH, 即高优先级模式,则第二,第三
次检查,根据pages_min 计算的标准值会更小些(即对free的数量要求更宽松些)
F)如果调用__alloc_pages()的上下文是中断上下文,则第二次检查没通过时,直接报错,
并不调用try_to_free_pages()进行直接物理页回收,也不进行第三次尝试
G)各个zone 的pages_min 是依据内核参数 /proc/sys/vm/min_free_kbytes 和该
zone的物理内存数目计算出来的,而pages_low, pages_high的值分别是
pages_min的2倍,3倍. 所以第二,三次检查的标准会比第一次检查宽松. 而
pages_high 的值是用来确定kswapd 进行后台回收时要包括哪些zones
H)另外,还有一些特殊的执行路径,他们要求内存分配必须成功,这些执行路径可能包
括:进行内存回收的进程(如进程调用try_to_free_pages时, kswapd),某些
journal 的代码,页表分配代码,一些特殊的驱动. 对于这些特殊要求情况,可执行第
四及更多次内存分配,执行该分配时进程被标记为PF_MEMALLOC, 且不进行任何free
页数量的检查, 或者说,只有这些路径的代码能使用预留的free页
9.系统的页回收过程通常会先考虑文件数据页,后考虑进程虚拟空间页. 而文件数
据页在系统执行物理页回收算法前通常已经是干净的(因为系统中还存在一个dirty 页flush机制,周期性或同步性地将dirty的文件页写到磁盘上), 所以执行系统物理页回收的过程时间通常是很短暂的,不会明显影响进程的正常执行活动. 当系统中dirty的进程虚拟空间页很多(如分配了太多共享内存时),文件数据页比率很小;
或者短期内有大量的文件写操作,而磁盘的flush速度非常慢,导致dirty文件页大量积压时,物理页回收过程就因为要写dirty页而变慢,会明显影响用户进程的执行速度
10.系统真正是否物理页紧缺,要看当前是否有swap in/swap out活动, 可用vmstat
观察
11. RHEL5/RHEL6上提供了一个手工执行内存回收的方式,如#> echo 3
> /proc/sys/vm/drop_caches可强制系统执行物理页回收
参考
1.http://www.csn.ul.ie/~mel/projects/vm/guide/html/understand/
2.内核源码文档/usr/src/linux/Documentation/sysctl/vm.txt
3.内核源码文档/usr/src/linux/Documentation/filesystems/proc.txt中关于
meminfo的描述
Qianfeng (Fronteer) Zhang
frzhang@
Red Hat Software, Beijing。