美文网首页
内存泄漏管理

内存泄漏管理

作者: 李霖弢 | 来源:发表于2023-02-07 15:05 被阅读0次

top

top类似ps指令,但可以进入对话模式,动态显示实时状况

进入top后的指令
  • l – 关闭或开启第一部分第一行 top 信息的表示
  • t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
  • m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
  • N – 以 PID 的大小的顺序排列表示进程列表
  • P – 以 CPU 占用率大小的顺序排列进程列表(默认按此排序)
  • M – 以内存占用率大小的顺序排列进程列表
  • h – 显示帮助
  • n – 设置在进程列表所显示进程的数量
  • q – 退出 top
  • s – 改变画面更新周期
  • f – 编辑哪些列显示
  • 1 – 按逻辑CPU区分显示情况
  • u – 按用户区分显示情况
  • E – 切换显示单位(KB\MB\GB)
显示内容
top - 15:17:11 up 41 days,  5:34,  0 users,  load average: 0.08, 0.11, 0.12

系统时间,系统至今运行时间,当前登录用户数,1、5、15分钟内平均系统负载(即任务队列的平均长度,通常数值不超过机器的总核数,就没问题)

Tasks:  13 total,   1 running,  12 sleeping,   0 stopped,   0 zombie

当前进程,运行中进程,休眠进程,停止进程,僵尸进程

%Cpu(s): 10.0 us,  3.3 sy,  0.0 ni, 86.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

CPU空间占用情况

KiB Mem :  7862312 total,   895436 free,  2730104 used,  4236772 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4792852 avail Mem

内存占用情况,以及硬盘提供的SWAP交换区占用情况。当内存不够用时开始占用SWAP

  • 进程信息
    PID 进程id
    USER 进程所有者的用户名
    PR 优先级
    NI nice值,负值表示高优先级,正值表示低优先级
    VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    SHR 共享内存大小,单位kb
    S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
    %CPU 上次更新到现在的CPU时间占用百分比
    %MEM 进程使用的物理内存百分比
    TIME+ 进程使用的CPU时间总计,单位1/100秒
    COMMAND 命令名/命令行

自动解决内存泄露

配置 gunicorn
gunicorn --max-requests 1000 --max-requests-jitter 50 ... app.wsgi

gunicorn.conf.py中配置

max_requests = 1000
max_requests_jitter = 50

--max-requests 让每个worker处理一定次数请求后自动重启(默认值为0,不重启)
--max-requests-jitter 用于防止多个worker刚好一起重启

配置 celery
  • 让每个worker处理一定次数任务后自动重启
app = Celery("myapp")
app.conf.worker_max_tasks_per_child = 100

或django的settings.py中配置

CELERY_WORKER_MAX_TASKS_PER_CHILD = 100
  • 也可以配置worker_max_memory_per_child限制每个worker可占用的内存大小:
import psutil

celery_max_mem_kilobytes = (psutil.virtual_memory().total * 0.75) / 1024
app.conf.worker_max_memory_per_child = int(
    celery_max_mem_kilobytes / app.conf.worker_concurrency
)

手动处理内存泄漏

objgraph
pip install objgraph 
import objgraph as graph
graph.count(some_dict) # 统计某个对象的数量
graph.show_growth() # 统计自从上次执行该方法后,各种数据类型的新增数

tracemalloc

相关文章

网友评论

      本文标题:内存泄漏管理

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