• Linux 缓存管理和内存泄露


    缓存命中率

    命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好。

    Linux 系统中并没有直接提供缓存查询接口,需要使用工具 cachestat 和 cachetop 查看:

    • cachestat 提供了整个操作系统缓存的读写命中情况。
    • cachetop 提供了每个进程的缓存命中情况。

    这两个工具都是 bcc 软件包的一部分,它们基于 Linux 内核的 eBPF(extended Berkeley Packet Filters)机制,来跟踪内核中管理的缓存,并输出缓存的使用和命中情况。

    bcc 软件包(BPF Compiler Collection)
    BCC is a toolkit for creating efficient kernel tracing and manipulation programs, and includes several useful tools and examples.
    BCC-github

    根据 github 上的操作指引进行安装,运行查看:

    
    [root@k8s ~]# cachestat 1 3
       TOTAL   MISSES     HITS  DIRTIES   BUFFERS_MB  CACHED_MB
           2        0        2        1           17        279
           2        0        2        1           17        279
           2        0        2        1           17        279 
    
    • TOTAL ,表示总的 I/O 次数;
    • MISSES ,表示缓存未命中的次数;
    • HITS ,表示缓存命中的次数;
    • DIRTIES, 表示新增到缓存中的脏页数;
    • BUFFERS_MB 表示 Buffers 的大小,以 MB 为单位;
    • CACHED_MB 表示 Cache 的大小,以 MB 为单位。

    Buffers 和 Cache 都是操作系统来管理的,应用程序并不能直接控制这些缓存的内容和生命周期。所以,在应用程序开发中,一般要用专门的缓存组件,来进一步提升性能。

    内存泄露

    应用程序可以访问的用户内存空间,由只读段、数据段、堆、栈以及文件映射段等组成。

    • 只读段,包括程序的代码和常量,由于是只读的,不会再去分配新的内存,所以也不会产生内存泄漏。
    • 数据段,包括全局变量和静态变量,这些变量在定义时就已经确定了大小,所以也不会产生内存泄漏。
    • 堆内存由应用程序自己来分配和管理。除非程序退出,这些堆内存并不会被系统自动释放,而是需要应用程序明确调用库函数 free() 来释放它们。如果应用程序没有正确释放堆内存,就会造成内存泄漏。
    • 栈内存由系统自动分配和管理。一旦程序运行超出了这个局部变量的作用域,栈内存就会被系统自动回收,所以不会产生内存泄漏的问题。
    • 文件映射段,包括动态链接库和共享内存,其中共享内存由程序动态分配和管理。所以,如果程序在分配后忘了回收,就会导致跟堆内存类似的泄漏问题。

    内存泄漏的危害非常大,这些忘记释放的内存,不仅应用程序自己不能访问,系统也不能把它们再次分配给其他应用。内存泄漏不断累积,甚至会耗尽系统内存。

  • 相关阅读:
    typescript
    heightChatrs
    数组的扩展
    es6函数扩展
    es6变量解构与函数解构
    C++ 编程技巧锦集(二)
    C++ 全排列
    C++ 编程技巧锦集(一)
    [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]列名 'user1' 无效
    2016年天梯赛初赛题集
  • 原文地址:https://www.cnblogs.com/galvin007/p/12668615.html
Copyright © 2020-2023  润新知