Troubleshooting(二):进程

前言

    服务器的意义就在于这些运行中的进程,这也是工作围绕的重点之一。

    在 Linux 和 Unix 中(Windows Server 基本没接触过)进程通常被定义为程序执行时的一个实例,每个进程都有一个自身的进程描述符,里面详细记录了关于进程的一切。

     Liunx 中查看进程状态的命令也大都围绕着这个进程描述符的,和 TCP 协议一样,每个域都有自身的含义,前辈们的设计理念还是很统一而高效的!   

    PS:关于进程描述符和比较偏底层的就不在这里详细介绍了,本人理解有限,传送门:《深入理解 Linux 内核》

 

进程状态

  •     ps

    ps:Process Status,从字面意思就可以看出来,这个命令是用来查看进程状态的。

    ps 命令列出了当前进程的快照,也就是说它不是动态的显示这些进程的,仅仅是执行命令那个时刻的进程信息,而在 Linux 中,/proc 目录就是存放进程相关的文件及目录,ps 命令也是通过读取这些文件来显示的(starce 命令可以追踪命令的系统调用 starce ps)。

    进程状态STAT

    D        不可中断(通常为 IO)

    R        正在运行中的进程

    S        已经中断的进程,处于休眠状态,系统中大部分进程都是这个状态

    T        停止或被暂停的进程

    W        没有做够的内存页分配

    X        已经死掉的进程

    Z        僵尸进程,进程已终止,但进程描述符还在,直到父进程调用 wait4() 系统调用后释放

 

    BSD 风格

    <        高优先级进程

    N        低优先级进程

    L        在内存中被锁了内存分页

    s        包含子进程

    l        多线程进程

    +        前台运行的进程

 

    VSZ:占用虚拟内存大小;(Mac 中压缩后的内存跟这个很像)

    RSS:占用内存大小;

    TTY:终端的次要装置号码;

 

    常用选项:    a  显示现行终端机下所有程序,不区分用户;

                       -A -e x  显示所有程序;

                       -H 树装显示(实在很鸡肋,仅用空格肉眼实在不好分辨)

 

  • pstree

    以树状结构显示进程,ps -H 的增强版。

 

  • pstack

    类似于 stack 命令,用于进程的栈跟踪,显示系统调用,偏底层,对于内功修炼很有帮助。

 

  • kill

    终止指定进程,kill 命令通过向进程发送指定的信号来结束相应进程的,默认采用 15 SIGTERM 的信号,-l 参数可以列出全部信号编号参数(含义可自行查找),常用的 HUP 1 终端断线、INT 2 中断、QUIT 3 退出、TERM 15 终止、KILL 9 强制终止、CONT 18 继续(与  STOP 相反)、STOP 19 暂停(同 Ctrl + z)

 

  • top/htop

    又一个 Linux 常用的进程管理工具,在性能分析时能实时显示各个进程的资源占用状况,类似于任务管理器。

    第一行:任务队列信息,同 uptime,load average 分别列出1、5、15分钟的负载数,大于 5 表示超负荷了。

    第二行:Tasks,处于某个状态的进程数;

    第三行:cpu 状态信息,us -- 用户空间cpu占用、sy —— 内核空间占用、ni——改变过优先级的进程占用、id——空闲cpu、wa——IO等待cpu占用、hi si 硬软中断占用;

    第四、五行:内存状态、swap 交换分区状态;

PS:简单计算可用内存数:第四行 free + 第四行 buff + 第五行 cache

    top 还支持交互命令的方式,h 可显示帮助信息,q 为退出,r 可调整进程的优先级。

    htop 类似于 top,默认是没有安装的,展示效果更好,因为命令大都是 F1~F10,mac 上按键不方便,用的较少。

 

  • nice/renice

    nice [OPTION] [command [arguments...]]

    调整进程运行的优先级,提高进程的优先级,内核会分配更多 CPU 时间片给这个进程,默认情况下进程是以 0 的优先级启动的,top 中 NI(nice value)列展示了进程的优先级情况,范围为 -20 ~ 19,值越低,优先级越高。

    renice 类似于 nice,-u -g 选项可指定用户和组来改变进程优先级。

 

  • ulimit

    ulimit shell 内建命令,调用系统 getrlimit 和 setrlimit API,来改变 resouce limit,从而改变 shell 启动的进程的 resource limit(子进程继承)。

    在 Linux 中,Resouce limit 指的是在一个进程执行的时候,所获得的资源限制:

    内核结构体定义了 rlimit 数据结构:

    ulimit 的 -S -H 参数分别对应内核的 soft limit 和 hard limit,hard limit 作为 soft limit 的上限,当设置了 hard limit 后,soft limit 就不能超过它,不指定这两个参数的时候,默认同时设置soft 和 hard。

    -a 参数可显示当前的限制设定,-c core 文件的最大值、-f shell 能建立的最大文件、-m 可使用的内存上限、-n 同时开启的文件、-t 指定 CPU 使用时间、-u 用户最多开启的程序数目。

    ulimit 限制程序所能创建的 socket 数量,对于 C/S 模型中的 server 来说,它会为多个 client 请求创建多个 socket 端口响应,linux创建一个新的socket,实际上也是创建了一个新的文件描述符,通过 ulimit -n来限制程序所能打开的最大文件描述符,可限制socket创建的数量。

    ulimit 限制的当前 shell 进程以及其派生的子进程,要想针对具体用户的资源加以限制,则需通过修改 /etc/security/limit.conf 配置文件来限定:

<domain>  <type>  <item>  <value>

    domain表示用户或组,type 为soft 和 hard,item表示需要限定的资源(cpu、stack、nofile等)

    如果想对整个系统做限制,则需要修改 /proc 的配置文件,/proc/sys/kernel/pid_max、/proc/sys/net/ipv4/ip_local_port_range 等等,通过修改内核的配置文件,来控制系统的资源限制。

 

  • cgroups

    cgroups(Control Groups)最初叫Process Container,由Google工程师(Paul Menage和Rohit Seth)于2006年提出,后来因为Container有多重含义容易引起误解,就在2007年更名为Control Groups,并被整合进Linux内核。顾名思义就是把进程放到一个组里面统一加以控制。ps:偷懒摘下维基百科

    最近很火的 docker 就是使用 cgroups 来管理 container 的资源的,linux 下重量级的资源管理框架,配上好的前端简直可以把配置系统资源这么抽象而微观的事情,变成一件可视化精细度很高的一件事,由于小的项目很少关注资源限制,所以大都用不上,不过不能否定它的强大。

    后续单独博客整理

 

  • pgrep

    通过进程号全局正则匹配,pgrep 扫描当前运行的进程,然后按照命令匹配出进程 PID,-u 可指定用户、-l 显示进程名称、-P 指定父进程号、-t 指定开启进程的终端。

 

  • fg/bg

    fg 和 bg 用来调度正在运行的任务,前台运行的程序使用 Ctrl-z 可以挂起这个程序,jobs 命令可以查看任务,fg 命令可以把作业调回前台运行,bg 则可以把程序调度到后台,& 用在命令最后,也可以把这个命令放到后台执行。

  • nohup

    不挂断地运行命令,nohup 运行由 command 参数和任何相关的 Arg 参数指定的命令,它会忽略所有挂断(SIGHUP)信号,从而使的程序接受不到挂断的信号。

    输出会附加到当前目录的 nohup.out 文件中,nohup command & 即可创建一个不挂起的进程到后台,命令提示 nohup 成功后在终端任意键即可回到命令窗口,exit 退出则可安全退出,直接在成功后就关闭终端,会断掉 session,导致 nohup 的进程被一起 shutdown。

 

  • ipcs

    ipcs 显示进程间通信设施状态,可以显示消息队列、共享内存和信号量,-m 查看系统使用的 IPC 共享内存资源、-q 系统使用 IPC 消息队列、-s 系统使用 IPC 信号量资源、-l 查询系统 IPC 参数限制。

    IPC(Inter-process Communication)进程间通信,指多个进程间相互通信,交换信息的方法,Linux IPC 基本是从 Unix(System V风格和 BSD 风格)平台继承的,支持 POSIX (Portable Operating System Interface 可移植操作系统接口)IPC。

    信号是 Linux 系统在一定条件下生产的事件,是一种异步通信机制,进程不需要执行任何操作来等待信号的到达,信号异步通知接收信号的进程发生了某个事件,然后操作系统会中断接收到信号的进程的执行,转而去执行相应的信号处理程序。管道是用来连接不同进程之间的数据流。

    修改系统的 IPC 参数,需要修改 /etc/sysctl.conf 文件,kernel.msgmax、kernel.msgmnb、kernel.msgmni、kernel.shmmax 等参数,sysctl -p 生效。

ps:未搞懂 ipcs,解释均摘自 google 查询,先记录,后续有时间研究下

 

    

    

 

    

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

    

    

    

转载于:https://my.oschina.net/u/2470065/blog/774927

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值