美文网首页
Linux x86_64 内存

Linux x86_64 内存

作者: 偷油考拉 | 来源:发表于2021-09-12 23:25 被阅读0次

    Debugging Memory on Linux | Linux Journal

    Kernel memory and User memory

    内核内存

    由以下组成:

    • Text — 存储程序的只读部分,通常是程序的实际指令代码。同一程序的多个实例可以共享此内存

    • Static Data — 分配已知内存的区域,通常是全局变量和静态C++类。操作系统为程序的每个实例分配此内存区域的副本。

    • Memory Arena (also known as break space) — 动态运行时内存区域。memory arenaheap unused memory组成。heap是用户分配内存。heap从低位的内存地址增长到高位内存地址。The heap is where all user-allocated memory is located.

    • Stack — 每当程序进行函数调用时,当前函数的状态需要保存到stack内。Stack从高位内存向地位内存增长。程序的每个实例都有唯一的memory arenastack

    图片.png

    用户内存

    它驻留在memory heap中,供内存例程(memory routines)调用,如malloc(), realloc, free(), callo()。
    因此,内存对系统性能很重要,是性能调优最关键之一。

    我们有很多工具可以用来测量系统性能,但有时会失败。
    比如某生产环境,60G内存、多核CPU、应用压力大,进而产生了数百万个连接,从而造成性能瓶颈。
    在这种情况下,运行top命令肯定不会反映实际内存使用情况。所以,我们不能依赖pstop命令,因为它们报告进程的内存使用情况,因为这是操作系统中运行的唯一进程,但实际上Linux还有一些shared libs的概念,因此当我们在进程上执行pstop来获得使用情况时,它会忽略其他与内存相关的内容,如显示实际内存使用情况的shared/private部分。

    提示:
    如上,Linux内存的使用是一个复杂问题;使用ps不能获知准确信息。特别是创建很多相同子进程的程序,比如Java。Ps命令可能会报告每个Java进程使用100M内存,而实际情况可能是每个Java进程的边际成本是10M内存。

    通过 pmap -x $pidwriteable/private显示内存使用情况。

    Linux Philosophy

    Linux的理念是,未使用的资源是浪费的资源。因此,内核将使用尽可能多的RAM来缓存本地/远程文件,并随着时间增长。该缓存被系统设定为buffers and pagecache的和。缓存可回收,不是在进程退出时,而是在需要时。即,当启动一个需要大量内存才能运行的进程时,Linux内核将回收存储缓存数据的内存,并将其提供给新进程。

    这些缓存不能直接被内核所用:

    1. anonymous mmaps, which are not backed by a file but by the swap area.

    2. shared memory regions, both System V IPC and POSIX /dev/shm ones.

    3. Some application servers and databases (e.g. SAP and Oracle DB) make usage of those shared memory facilities as a very convenient way of sharing data between multiple processes.

    虽然 anonymous mmapsshared memory regions 都可以被交换到磁盘,因此,理论上程序可以使用该内存。这种情况会导致性能问题。

    因此,如上情况,并非所有报告为“cached”的内存都被统计为available内存。
    这与普通缓存不同。普通缓存不是任何正在运行的进程的地址空间的一部分,只是一个内核映射。

    比如:

    # free -m
    total used free shared buffers cached
    Mem: 1000 900 100 0 350 350
    -/+ buffers/cache: 200 800
    

    本例中,系统仅使用200MB的内存,并有800MB的空闲空间,可在需要时使用(只要没有anonymous memory maps或shared memory regions)。

    计算:

    Total Physical Memory = 1000 M
    Physically Used Memory = 900 M
    Actual used memory = 200 M
    buffers = 350 M
    cached = 350 M
    Physically Free Memory = 100 M
    Memory free for Applications = 800 M
    
    <Physically Used Memory> = <Actual used memory> + <buffers> + <cache> = 200 + 350 + 350 = 900 M
    <Physically Free Memory> = <Total Physical Memory> - <Actual used memory> - <buffers> - <cache> = 1000 - 200 - 350 - 350 = 100 M
    <Memory free for Applications> = <Total Physical Memory> - <Actual used memory> = 1000 - 200 = 800 M
    <Memory used  by Applications> = <Physically Used Memory> - <buffers> - <cache> = 900 - 350 - 350 = 200 M
    

    相关文章

      网友评论

          本文标题:Linux x86_64 内存

          本文链接:https://www.haomeiwen.com/subject/jpfeiltx.html