文档章节

Troubleshooting(二):进程

诸葛孔明亮
 诸葛孔明亮
发布于 2016/10/24 17:37
字数 2350
阅读 7
收藏 0

前言

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

    在 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 查询,先记录,后续有时间研究下

 

    

    

 

    

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

    

    

    

© 著作权归作者所有

共有 人打赏支持
诸葛孔明亮
粉丝 2
博文 64
码字总数 53931
作品 0
浦东
运维
【apache-hive-1.2.1】 hwi

一、下载hive-src.tar [hadoop@hftest0001 ~]$ pwd/home/hadoop [hadoop@hftest0001 ~]$ wget [hadoop@hftest0001 ~]$ tar -zxvf apache-hive-1.2.1-src.tar.gz [hadoop@hftest0001 hwi]$ cd......

HarryWu
2016/01/25
509
0
与IO相关的等待事件troubleshooting-系列9

Buffer Cache与IO相关的等待事件: 这种等待事件的产生原因是包含DBWR进程和IO Slaves的Buffer Cache操作。 'db file parallel write' , 'db file single write', 'write complete waits', '...

bisal
2013/10/12
0
0
linux 系统监控、诊断工具之 IO wait

1、问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端、本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台机器 top 看到负载巨高...

大数据之路
2014/12/14
0
17
关于Redis延迟,不同系统下fork操作时间对比

在Redis latency problems troubleshooting页面中,作者对Redis延迟问题的成因进行了全方位的剖析,其中一项便是fork操作占用时间导致的延迟。最近Redis作者又对fork操作在各虚拟系统中的性能...

哈哈呵呵R
2014/04/04
0
0
Spark 学习资源收集

(一)spark 相关安装部署、开发环境 1、Spark 伪分布式 & 全分布式 安装指南 http://my.oschina.net/leejun2005/blog/394928 2、Apache Spark探秘:三种分布式部署方式比较 http://dongxic...

openthings
2016/05/29
164
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

7 个致命的 Linux 命令

导读 如果你是一个 Linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避...

问题终结者
今天
0
0
设计模式:工厂方法模式(工厂模式)

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。 工厂方法的类图: 这里面涉及到四个种类: 1、抽象产品: Product 2、...

京一
今天
0
0
区块链和数据库,技术到底有何区别?

关于数据库和区块链,总会有很多的困惑。区块链其实是一种数据库,因为他是数字账本,并且在区块的数据结构上存储信息。数据库中存储信息的结构被称为表格。但是,区块链是数据库,数据库可不...

HiBlock
今天
0
0
react native 开发碰到的问题

react-navigation v2 问题 问题: static navigationOptions = ({navigation, navigationOptions}) => ({ headerTitle: ( <Text style={{color:"#fff"}}>我的</Text> ), headerRight: ( <View......

罗培海
今天
0
0
Mac Docker安装流程

久仰Docker大名已久,于是今天趁着有空,尝试了一下Docker 先是从docker的官网上下载下来mac版本的docker安装包,安装很简易,就直接拖图标就好了。 https://www.docker.com/products/docker...

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部