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() # 统计自从上次执行该方法后,各种数据类型的新增数
网友评论