linux内存分布,ubuntu查看内存信息

本篇文章给大家谈谈linux内存分布,以及ubuntu查看内存信息对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

如何查看Linux内存中的程序所有堆的地址

linux下面查看内存有多种渠道,比如通过命令 ps,top,free等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc系统,下面介绍/proc系统下内存相关的几个文件

单个进程的内存查看 cat/proc/[pid]下面有几个文件: maps, smaps, status

maps文件可以查看某个进程的代码段、栈区、堆区、动态库、内核区对应的虚拟地址,如果你还不了解linux进程的内存空间,可以参考这里。

下图是maps文件内存示例

Develop>cat/proc/self/maps

00400000-0040b000 r-xp 00000000 fd:00 48/mnt/cf/orig/root/bin/cat

0060a000-0060b000 r--p 0000a000 fd:00 48/mnt/cf/orig/root/bin/cat

0060b000-0060c000 rw-p 0000b000 fd:00 48/mnt/cf/orig/root/bin/cat代码段

0060c000-0062d000 rw-p 00000000 00:00 0 [heap]堆区

7f1fff43b000-7f1fff5d4000 r-xp 00000000 fd:00 861/mnt/cf/orig/root/lib64/libc-2.15.so

7f1fff5d4000-7f1fff7d3000---p 00199000 fd:00 861/mnt/cf/orig/root/lib64/libc-2.15.so

7f1fff7d3000-7f1fff7d7000 r--p 00198000 fd:00 861/mnt/cf/orig/root/lib64/libc-2.15.so

7f1fff7d7000-7f1fff7d9000 rw-p 0019c000 fd:00 861/mnt/cf/orig/root/lib64/libc-2.15.so

7f1fff7d9000-7f1fff7dd000 rw-p 00000000 00:00 0

7f1fff7dd000-7f1fff7fe000 r-xp 00000000 fd:00 2554/mnt/cf/orig/root/lib64/ld-2.15.so

7f1fff9f9000-7f1fff9fd000 rw-p 00000000 00:00 0

7f1fff9fd000-7f1fff9fe000 r--p 00020000 fd:00 2554/mnt/cf/orig/root/lib64/ld-2.15.so

7f1fff9fe000-7f1fff9ff000 rw-p 00021000 fd:00 2554/mnt/cf/orig/root/lib64/ld-2.15.so

7f1fff9ff000-7f1fffa00000 rw-p 00000000 00:00 0

7fff443de000-7fff443ff000 rw-p 00000000 00:00 0 [stack]用户态栈区

7fff443ff000-7fff44400000 r-xp 00000000 00:00 0 [vdso]

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]内核区

有时候可以通过不断查看某个进程的maps文件,通过查看其虚拟内存(堆区)是否不停增长来简单判断进程是否发生了内存溢出。

maps文件只能显示简单的分区,smap文件可以显示每个分区的更详细的内存占用数据

下图是smaps文件内存示例,实际显示内容会将每一个区都显示出来,下面我只拷贝了代码段和堆区,

每一个区显示的内容项目是一样的,smaps文件各项含义可以参考这里

Develop>cat/proc/self/smaps

00400000-0040b000 r-xp 00000000 fd:00 48/mnt/cf/orig/root/bin/cat

Size: 44 kB虚拟内存大小

Rss: 28 kB实际使用物理内存大小

Pss: 28 kB

Shared_Clean: 0 kB页面被改,则是dirty,否则是clean,页面引用计数>1,是shared,否则是private

Shared_Dirty: 0 kB

Private_Clean: 28 kB

Private_Dirty: 0 kB

Referenced: 28 kB

Anonymous: 0 kB

AnonHugePages: 0 kB

Swap: 0 kB处于交换区的页面大小

KernelPageSize: 4 kB操作系统一个页面大小

MMUPageSize: 4 kB体系结构MMU一个页面大小

Locked: 0 kB

0060c000-0062d000 rw-p 00000000 00:00 0 [heap]

Size: 132 kB

Rss: 8 kB

Pss: 8 kB

Shared_Clean: 0 kB

Shared_Dirty: 0 kB

Private_Clean: 0 kB

Private_Dirty: 8 kB

Referenced: 8 kB

Anonymous: 8 kB

AnonHugePages: 0 kB

Swap: 0 kB

KernelPageSize: 4 kB

MMUPageSize: 4 kB

Locked: 0 kB

下图是status文件内存示例,加粗部分是内存相关的统计,

Develop>cat/proc/24475/status

Name: netio可执行程序的名字

State: R(running)任务状态,运行/睡眠/僵死

Tgid: 24475线程组号

Pid: 24475进程id

PPid: 19635父进程id

TracerPid: 0

Uid: 0 0 0 0

Gid: 0 0 0 0

FDSize: 256该进程最大文件描述符个数

Groups: 0

VmPeak: 6330708 kB内存使用峰值

VmSize: 268876 kB进程虚拟地址空间大小

VmLck: 0 kB进程锁住的物理内存大小,锁住的物理内存无法交换到硬盘

VmHWM: 16656 kB

VmRSS: 11420 kB进程正在使用的物理内存大小

VmData: 230844 kB进程数据段大小

VmStk: 136 kB进程用户态栈大小

VmExe: 760 kB进程代码段大小

VmLib: 7772 kB进程使用的库映射到虚拟内存空间的大小

VmPTE: 120 kB进程页表大小

VmSwap: 0 kB

Threads: 5

SigQ: 0/63346

SigPnd: 0000000000000000

ShdPnd: 0000000000000000

SigBlk: 0000000000000000

SigIgn: 0000000001000000

SigCgt: 0000000180000000

CapInh: 0000000000000000

CapPrm: ffffffffffffffff

CapEff: ffffffffffffffff

CapBnd: ffffffffffffffff

Cpus_allowed: 01

Cpus_allowed_list: 0

Mems_allowed: 01

Mems_allowed_list: 0

voluntary_ctxt_switches: 201

nonvoluntary_ctxt_switches: 909

可以看到,linux下内存占用是一个比较复杂的概念,不能

简单通过一个单一指标就判断某个程序“内存消耗”大小,原因有下面2点:

进程所申请的内存不一定真正会被用到(malloc或mmap的实现)

真正用到了的内存也不一定是只有该进程自己在用(比如动态共享库)

关于内存的使用分析及本文几个命令的说明也可以参考这里

下面是查看整机内存使用情况的文件/proc/meminfo

Develop>cat/proc/meminfo

MemTotal: 8112280 kB所有可用RAM大小(即物理内存减去一些预留位和内核的二进制代码大小)

MemFree: 4188636 kB LowFree与HighFree的总和,被系统留着未使用的内存

Buffers: 34728 kB用来给文件做缓冲大小

Cached: 289740 kB被高速缓冲存储器(cache memory)用的内存的大小

(等于 diskcache minus SwapCache)

SwapCached: 0 kB被高速缓冲存储器(cache memory)用的交换空间的大小

已经被交换出来的内存,但仍然被存放在swapfile中。

用来在需要的时候很快的被替换而不需要再次打开I/O端口

Active: 435240 kB在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,

除非非常必要否则不会被移作他用

Inactive: 231512 kB在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径.

Active(anon): 361252 kB

Inactive(anon): 120688 kB

Active(file): 73988 kB

Inactive(file): 110824 kB

Unevictable: 0 kB

Mlocked: 0 kB

SwapTotal: 0 kB交换空间的总大小

SwapFree: 0 kB未被使用交换空间的大小

Dirty: 0 kB等待被写回到磁盘的内存大小

Writeback: 0 kB正在被写回到磁盘的内存大小

AnonPages: 348408 kB未映射页的内存大小

Mapped: 33600 kB已经被设备和文件等映射的大小

Shmem: 133536 kB

Slab: 55984 kB内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗

SReclaimable: 25028 kB可收回Slab的大小

SUnreclaim: 30956 kB不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)

KernelStack: 1896 kB内核栈区大小

PageTables: 8156 kB管理内存分页页面的索引表的大小

NFS_Unstable: 0 kB不稳定页表的大小

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 2483276 kB

Committed_AS: 1804104 kB

VmallocTotal: 34359738367 kB可以vmalloc虚拟内存大小

VmallocUsed: 565680 kB已经被使用的虚拟内存大小

VmallocChunk: 34359162876 kB

HardwareCorrupted: 0 kB

HugePages_Total: 1536大页面数目

HugePages_Free: 0空闲大页面数目

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB大页面一页大小

DirectMap4k: 10240 kB

DirectMap2M: 8302592 kB

如何查看linux内存看linux内存

linux里如何判断运行内存?

linux如何查看内存,以下就是如何判断运行内存的具体方法:

1、打开linux系统,在linux的桌面的空白处右击。

?

2、然后在弹出的下拉选项里,点击打开终端。

?

3、输入cat/proc/meminfo命令,回车运行即可查看内存数据,其中memfree代表剩余内存。

?

linux下查看内存的命令?

top命令能显示系统内存。目前常用的Linux下查看内容的专用工具是free命令。下面是对内存查看free命令输出内容的解释:

total:总计物理内存的大小。

used:已使用多大。

free:可用有多少。

Shared:多个进程共享的内存总额。

Buffers/cached:磁盘缓存的大小。熟悉linux基础命令,可以看看《linux就该这么学》一书。

AIX和Linux下如何查看CPU和内存信息?

AIX的硬件信息可以通过prtconf命令看到。

1.查看逻辑CPU个数

#pmcycles-m

CPU0runsat4204MHz

CPU1runsat4204MHz

CPU2runsat4204MHz

CPU3runsat4204MHz

CPU4runsat4204MHz

CPU5runsat4204MHz

CPU6runsat4204MHz

CPU7runsat4204MHz

上面描述有8个CPU,CPU的主频为4.2G赫兹

2.查看物理CPU个数

#prtconf|grepProcessors

NumberOfProcessors:4

3.确定CPU是几核

用逻辑CPU除以物理CPU就是核数。

4.查看单个CPU的详细信息

#lsattr-E-lproc0

frequency4204000000ProcessorSpeedFalse

smt_enabledtrueProcessorSMTenabledFalse

smt_threads2ProcessorSMTthreadsFalse

stateenableProcessorstateFalse

typePowerPC_POWER6ProcessortypeFalse

Linux操作系统

Linux下的CPU信息全部都在/proc/cpuinfo这个文件中,可以直接打开看。

1.查看物理CPU的个数

#cat/proc/cpuinfo|grep"physicalid"|sort|uniq|wc-l

2.查看逻辑CPU的个数

#cat/proc/cpuinfo|grep"processor"|wc-l

3.查看CPU是几核

#cat/proc/cpuinfo|grep"cores"|uniq

4.查看CPU的主频

#cat/proc/cpuinfo|grepMHz|uniq

如何记录linux服务器内存使用情况?

1、查看内存:在SSH远程控制端,输入命令“cat/proc/meminfo”,按下“Enter”回车键,即可看到总的内存占用情况。

2、查看CPU:在SSH远程控制端,输入命令“top”,按下“Enter”回车键,即可看到cpu的使用率。

3、Linux上的VNC服务端,比较常用的就是tigervnc和x11vnc。x11vnc可以让远程访问者控制本地的实际显示器,而tigervnc既可以远程控制实际显示器,还可以控制平行独立于当前物理显示器的虚拟显示器。

如何读取linux内核共享内存的值?

我们可以修改shmmax内核参数,使SGA存在于一个共享内存段中。通过修改/proc/sys/kernel/shmmax参数可以达到此目的。#echo1073741824>/proc/sys/kernel/shmmax#more/proc/sys/kernel/shmmax1073741824这里设为1G。对于shmmax文件的修改,系统重新启动后会复位。可以通过修改/etc/sysctl.conf使更改永久化。在该文件内添加以下一行kernel.shmmax=1073741824这个更改在系统重新启动后生效.1、设置SHMMAXSHMMAX参数定义共享内存段的最大尺寸(以字节为单位)。在设置SHMMAX时,切记SGA的大小应该适合于一个共享内存段。SHMMAX设置不足可能会导致以下问题:ORA-27123:unabletoattachtosharedmemorysegment您可以通过执行以下命令来确定SHMMAX的值:#cat/proc/sys/kernel/shmmax33554432SHMMAX的默认值是32MB。我一般使用下列方法之一种将SHMMAX参数设为2GB:通过直接更改/proc文件系统,你不需重新启动机器就可以改变SHMMAX的默认设置。我使用的方法是将以下命令放入/etc/rc.local启动文件中:#>echo"2147483648">/proc/sys/kernel/shmmax您还可以使用sysctl命令来更改SHMMAX的值:#sysctl-wkernel.shmmax=2147483648最后,通过将该内核参数插入到/etc/sysctl.conf启动文件中,您可以使这种更改永久有效:#echo"kernel.shmmax=2147483648">>/etc/sysctl.conf2、设置SHMMNI我们现在来看SHMMNI参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是4096。这一数值已经足够,通常不需要更改。您可以通过执行以下命令来确定SHMMNI的值:#cat/proc/sys/kernel/shmmni40963、设置SHMALL最后,我们来看SHMALL共享内存内核参数。该参数控制着系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应该至少为:ceil(SHMMAX/PAGE_SIZE)SHMALL的默认大小为2097152,可以使用以下命令进行查询:#cat/proc/sys/kernel/shmall2097152SHMALL的默认设置对于我们的Oracle9iRAC安装来说应该足够使用。注意:在i386平台上RedHatLinux的页面大小为4096字节。但是,您可以使用bigpages,它支持配置更大的内存页面尺寸。

超详细|Linux 如何进行内存分配

Linux操作系统中的虚拟内存管理分为内核空间和用户空间两大部分。在32位和64位系统中,地址空间范围不同,每个进程拥有独立的虚拟内存,内核地址关联相同物理内存,便于进程切换至内核态访问。用户空间内存分布,以32位系统为例,从低到高分为6种不同的内存段。

申请内存空间通常有两种方式:malloc和mmap。使用malloc时,系统可能调用brk或mmap函数。当分配小型内存(小于或等于128kb),malloc会通过brk函数移动堆顶指针获取新空间;分配大型内存(大于128kb)时,mmap通过私有匿名映射在文件映射区分配内存。

malloc分配的是虚拟内存,未被访问的虚拟内存不会映射到物理内存,不占用物理内存资源。访问已分配虚拟地址空间时,操作系统通过查找页表建立虚拟内存与物理内存映射关系。缺页中断发生在虚拟内存不在主存时,系统将文件映射为分页交换文件。

分配内存后使用free释放内存,malloc通过brk系统调用在堆空间预分配内存,内存释放缓存在内存池,下次申请时直接取用,减少了系统调用和缺页中断次数,降低CPU消耗。相反,使用mmap分配内存每次释放时归还给操作系统,频繁使用mmap分配内存会导致CPU消耗较大,且增加运行态切换和缺页中断次数。

通过brk分配内存时,连续申请并释放大块内存后,堆内可能产生不可用的碎片,导致内存泄露。随着频繁的malloc和free操作,尤其是对小块内存的使用,系统内将累积越来越多不可用的碎片,引发“内存泄露”问题,这种现象在使用valgrind时无法检测。因此,malloc默认分配大块内存(128KB)时使用mmap分配空间,以优化内存管理。

阅读剩余
THE END