2005-06-01 17:39:00 vcbear 阅读数 7384

UNIX内存占用基本检查

1: 使用top指令.

  top指令是按cpu占用率排序的,如果想一次获得所有进程的快照,使用命令

top -n [最大进程数] -f 输出到文件,比如top -n 1000 -f topsnapshot.log

  top指令输出内存的统计信息包括

Memory: 2614368K (2249100K) real, 5838616K (5264696K) virtual, 113028K free  Page# 1/1
其中没有括号起来的是总数,括号括起来的部分是活动进程使用的内存数,free则是真实空闲的物理内存数.

进程信息的列包括

CPU TTY  PID USERNAME PRI NI   SIZE    RES STATE    TIME %WCPU  %CPU COMMAND

和内存相关的只有SIZE和RES

SIZE:任务的代码加上数据再加上栈空间的大小。
RES:任务使用的物理内存的总数量

要检查进程是否有内存泄露,和实际占用的内存大小,看RES列即可.

2:检查共享内存占用的内存容量

使用ipcs -m -b命令,-m表示检查共享内存,-b表示输出每个内存的字节数,得到的共享内存信息输出列包括:

T         ID     KEY        MODE        OWNER     GROUP      SEGSZ

SEGSZ列则是字节数.把每列相加则是共享内存占用的内存总数.

3: 调整内核动态高速缓冲区参数

HP-UX某些型号的服务器运行的时候需要几乎1G的内存维持系统运行,比如作为设备缓冲什么的.

可以用kmtune命令检查内核配置参数,动态高速缓冲区参数dbc_min_pct 和 dbc_max_pct参数表示一个高速缓冲区允许的可用内存的最小和最大百分比,dbc_max_pct的缺省值是50,一般设置为10即可.

4:在HP-UX上还可以使用glance

glance是个很强的工具,可惜不是免费的....

2012-12-29 16:57:03 iteye_14998 阅读数 104
首先要明确一个问题:Linux系统内存占用90%以上,是否属于正常范围?网上有详细的解释,这属于正常现象~~~

Linux/Unix系统管理内存的方式和windows是不一样的,即便是一个负载很小的linux,跑几天后,内存占用量也将达到90%以上,即便无人访问,这个数字是完全正常的。但是,这个内存占用量不会达到100%的,每天夜里系统都会执行/etc/cron.daily进行内存优化。

Linux/Unix系统是非常稳健的,虽然内存占用显示90%以上,但依然可保证365天以上无须重启。对于Linux系统,评估其压力的主要指标是最近5分钟的负载指数:比如用w命令或者top去看,可以看到“0.70 0.35 0.01”这样的数字,分别表示5分钟内的、10分钟内的、15分钟内排队的进程数,只要第一个数字即5分钟内的负载不大于5,系统就是健康的,不用做任何维护;如果这个数字大于了5,那么通常系统速度就会变慢,一般有如下几种可能:

1) 有程序占用大量CPU,使用top命令来检查(看看是否有java程序锁死之类的故障)

2) 有程序占用大量内存,使得内存真正不够用了(这个才是真正需要加内存的时候),比如由于MySQL在较大负载下运行容量为GB级别的数据库导致内存不够用,需要给服务器插入更多物理内存

3) 磁盘系统读写故障,IO吞吐错误造成CPU负载上升,需要光盘引导进入单用户模式扫描修复磁盘,修不好就只能更换新硬盘了

因此,对于Linux/Unix系统内存占用的百分比,无须过于关心,一般检查系统负载参数即可


但也可以手动进行内存释放,具体操作如下:

# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默认为0
# sync
手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
# echo 3 > /proc/sys/vm/drop_caches
# cat /proc/sys/vm/drop_caches
3
将/proc/sys/vm/drop_caches值设为3
# free -m
total used free shared buffers cached
Mem: 249 66 182 0 0 11
-/+ buffers/cache: 55 194
Swap: 511 0 511
再来运行free命令,发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB.那么有效的释放了buffer和cache.
2013-04-27 11:30:30 bingyu0422 阅读数 1121
服务器unix下 进过ps -eF 查看 有很多 gdm都是sleep状态,不并且这些gdm进程占用内存很大,都是很久之前的。也不知道能不能kill强制杀掉。 重启之后,这些进程就没有了,内存也释放了。不重启一直占用内存不释放是怎么回事啊?紧急抓狂
2011-10-23 17:28:45 chenside2002 阅读数 3363

这篇文章主要是写给自己,一位自己多年深受windows其害,导致对操作系统中某些不规范的程序对内存的占用很是敏感,windows操作系统本身又不会回收这些本应该再关闭的时候释放掉的内存,就这样随着你开机时间的增加,内存占用越来越高。。。。然后。。

        呃,言归正传,总之,我对unix系统又本本主义了一把,我还是赶紧说说在mac下对内存的使用问题吧,给自己留个参考。

    简单的说,Mac OS X的[内存]使用情况分为:wired, active, inactive和free四种。
  wired是系统核心占用的,永远不会从系统物理[内存]种驱除。
  active表示这些[内存]数据正在使用种,或者刚被使用过。
  inactive表示这些[内存]中的数据是有效的,但是最近没有被使用。
  free, 表示这些[内存]中的数据是无效的,这些空间可以随时被程序使用。

  当free的[内存]低于某个值(这个值是由你的物理[内存]大小决定的),系统则会按照以下顺序使用inactive的资源。首先如果inactive的数据最近被调用了,系统会把它们的状态改变成active,并接在原有active[内存]逻辑地址的后面, 如果inactive的[内存]数据最近没有被使用过,但是曾经被更改过而还没有在硬盘的相应虚拟[内存]中做修改,系统会对相应硬盘的虚拟[内存]做修改,并把这部分物理[内存]释放为free供程序使用。如果inactive[内存]中得数据被在映射到硬盘后再没有被更改过,则直接释放成free。最后如果active的[内存]一段时间没有被使用,会被暂时改变状态为inactive。

  所以说,如果你的系统里有少量的free memeory和大量的inactive的memeory,说明你的[内存]是够用的,系统运行在最佳状态,只要需要,系统就会使用它们,不用担心。而反之如果系统的free memory和inactive memory都很少,而active memory很多,说明你的[内存]不够了。当然一开机,大部分[内存]都是free,这时系统反而不在最佳状态,因为很多数据都需要从硬盘调用,速度反而慢了。

  windows为了兼容古老和不规范的程序,允许程序直接控制硬件,导致windows系统的权力不够大,而许多windows程序也不规范,因此在退出进程后往往许多[内存]没有还给系统变成了invisible memory,导致时间一长系统可用[内存]越来越少。因此常常需要重新启动。

2019-08-08 18:12:46 weixin_41164184 阅读数 38

前言

  内存是linux中很重要的一块,内存不足、内存泄漏、内存溢出也是在测试项目中经常会遇到的问题。

  在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实这是Linux内存管理的一个优秀特性,在这方面,区别于Windows的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充分利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。

  而Windows是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些物理内存,Linux都将能充分利用起来,发挥了硬件投资带来的好处,而Windows只将其做为摆设,即使增加8GB甚至更大。

一、物理内存和虚拟内存

  我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。

  物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在Linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。

二、进程与内存

  程序是保存在磁盘上的可执行文件,加载到内存中被操作系统调用执行的程序叫进程(一个程序可以被同时执行多次形成身份不同的进程)。

进程在内存空间中的分布情况叫进程映像。它们从低地址到高地址依次排列:

代码段/只读段 存放的是可执行指令/二进制指令、字符串字面值、具有const属性且被初始化过的全局、静态变量
数据段 存放被初始化的全局变量和静态变量
BSS段 存放没有被初始化的全局变量和静态变量,进程一旦加载成功,这段内存就会清为0
存放非静态的局部变量,包括函数的参数和返回值,它和堆内存之间存在一段空隙
malloc、new等函数申请的内存,需要手动分配和释放
命令行参数和环境变量表 存放命令行参数和环境变量表
下面用一个例子打印各段内存的地址然后与操作系统中的内存分配表比较,然后一一对应内存的分配情况:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// 常属性全局变量
const int const_global = 100;
// 初始化的全局变量
int init_global = 100;
// 末初始化的全局变量
int uninit_global;

int main(int argc,char* argv[],char* environ[])
{
	// 常属性静态局部变量
	const static int const_static = 100;
	// 初始化的静态局部变量
	static int init_static = 100;
	// 末初始化的静态局部变量
	static int uninit_static;
	// 常局部变量
	const int const_local;
	// 局部变量
	int local;
	// 堆地址
	void* heap_ptr = malloc(4);
	// 字符串字面值地址
	const char* const_str = "hehe";

	printf("----------从低到高依次是----------\n");
	printf("代码段:%p\n",main);
	printf("只读段:%p %p %p\n",&const_global,&const_static,const_str);
	printf("数据段:%p %p\n",&init_global,&init_static);
	printf("BSS段:%p %p\n",&uninit_global,&init_static);
	printf("堆:%p\n",heap_ptr);
	printf("栈:%p %p\n",&const_local,&local);
	printf("命令行参数:%p\n",argv[0]);
	printf("环境变量表:%p\n",environ[0]);
	printf("cat /proc/%d/maps\n",getpid());
	getchar();
}

执行结果

zhizhen@zhizhen-VirtualBox:~/fuxi$ vi demo1.c

----------从低到高依次是----------
代码段:0x80484a4
只读段:0x80486a0 0x8048778 0x80486a4
数据段:0x804a024 0x804a028
BSS段:0x804a038 0x804a028
堆:0x921d008
栈:0xbfe0f840 0xbfe0f844
命令行参数:0xbfe1039d
环境变量表:0xbfe103a5
cat /proc/2589/maps

然后执行cat /proc/2589/maps查看内存分配情况(此处必须保证程序在运行)
在这里插入图片描述
结论:
1、数据段与代码段放在一个内存空间(只读-可执行权限),但还有一段空间为只读权限,可能是操作系统在使用。
2、数据段和BSS段也放在一个内存空间
3、命令行参数、环境变量表放在栈中。

三、进程与虚拟内存

每个进程都有各自独立的4G字节的虚拟地址空间,我们在编程时使用的都是这4G的虚拟地址空间,永远无法直接访问物理地址。

操作系统不会让程序直接访问物理内存而只能使用虚拟地址空间的原因:
①、为了保障操作系统自身的安全;
②、可以让程序使用到比物理内存更大的地址空间(把硬盘上的特殊文件与虚拟地址空间进行映射)。

这里的4G 的虚拟地址空间被分为两部分:

0-3G 用户空间
3-4G 内核空间
注意:用户空间的代码不能直接访问内核空间的代码和数据,但可以通过系统调(不是函数,但函数形式调用)用进入到内核间接与内核交换数据。如果使用了没有映射过的或者访问没有权限的虚拟内存地址,就会产生段错误(非法内存访问)。

  Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

四、内存各层管理

函数 属于 调用情况
自动分配/释放内存(智能指针) STL库 调用C++的new/delete函数
new/delete调用/析构 C++ 调用C中的malloc/free
malloc/free 标准C库 调用POSIX
brk/sbrk POSIX 调用Linux系统接口
mmap/munmap Linux 调用内核接口
kmalloc/vmalloc 内核 调用驱动
get free page 驱动 ......

五、内存管理API

这里主要介绍两个函数:

它们都可以进行映射内存的取消映射(系统级的内存管理),他们背后维护者一个指针,该指针记录的是未分配内存的首地址(当前堆内存的最后一个字节的下一个位置),一次至少映射一个页.

1、 void *sbrk(intptr_t increment);

参数:increment

increment = 0 获取未分配前的内存首地址(也就是已经分配尾地址)
increment > 0 增加内存空间
increment < 0 释放内存空间
返回值:未分配前的内存首地址,以字节为单位

2、int brk(void *addr);

addr:直接设置内存的尾地址(也就是未分配内存的首地址)

返回值:成功为0,失败为-1.

注意:
	sbrk和brk分配和释放的都是使用权,真正的映射工作由其他系统调用完成(mmap/munmap).

关于mmap/munmap等函数小编就不一一介绍了,希望大家指正错误。

unix & linux oralce用户 内存使用分析

博文 来自: u012007236

linux查看内存占用

阅读数 1289

没有更多推荐了,返回首页