Linux程序管理:top.htop.glances,dstat等命令使用方法



进程和线程的区别:

  定义:

进程是具有一定独立功能的程序,是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

区别:

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

什么是进程?

在Linux系统中:触发任何一个事件时,系统都会将它定义为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性,给予这个PID一组有效的全乡设置。而程序就是系统工作时,启动的二进制文件。程序一般是在磁盘中的,通过用户的执行触发,然后加载到内存中成为一个个体,即进程。而常驻在内存中的进程通常都是负责一些系统所提供的功能以服务用户的各项任务,因此这些常驻进程就会被称为服务

 

总结:

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

 

将前台作业送往后台的方法:

用&或Ctrl+z:

例:

1

2

3

4

5

6

[root@bogon ~]# cp -r /etc/ /tmp/etc &

[1] 2610

[root@bogon ~]# jobs

[1]+  Running                 cp -i -r /etc/ /tmp/etc &

[root@bogon ~]# jobs

[1]+  Done                    cp -i -r /etc/ /tmp/etc


例:

vim a.txt

Ctrl+z

jobs命令用法:

jobs [-lrs]

-l : 除了列出jobnumber还列出PID号码

-r :只列出在后台run的作业

-s :仅列出在后台stop的作业

 


例 : bg %1

 

管理后台当中的作业kill命令:

列出kill能使用的信号有哪些:kill -l

1

2

3

4

5

6

7

8

9

10

11

12

13

14

[root@bogon ~]# kill -l

 1) SIGHUP     2) SIGINT     3) SIGQUIT    4) SIGILL     5) SIGTRAP

 6) SIGABRT    7) SIGBUS     8) SIGFPE     9) SIGKILL   10) SIGUSR1

11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM

16) SIGSTKFLT  17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP

21) SIGTTIN    22) SIGTTOU    23) SIGURG 24) SIGXCPU    25) SIGXFSZ

26) SIGVTALRM  27) SIGPROF    28) SIGWINCH   29) SIGIO  30) SIGPWR

31) SIGSYS 34) SIGRTMIN   35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3

38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8

43) SIGRTMIN+9 44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13

48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12

53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7

58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

63) SIGRTMAX-1 64) SIGRTMAX  

kill -信号数字 %jobnumber

-1 重新读取一次配置文件

-2 中断,与Ctrl+c一样

-9 强制删除一个工作

-15 以正常方式终止一项作业

 

注意-9 一般是在强制删除一个不正常的作业时所使用的,-15则是以正常步骤结束一项作业(15也是默认值)

 

例:kill -9 %1

进程管理:

 

1.进程查看:

 

pstree命令用法:

pstree命令:     进程树查看;

-p: 显示各进程的PID;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

[root@bogon ~]# pstree

init─┬─abrtd

     ├─acpid

     ├─atd

     ├─auditd───{auditd}

     ├─automount───4*[{automount}]

     ├─console-kit-dae───63*[{console-kit-da}]

     ├─crond

     ├─cupsd

     ├─dbus-daemon

     ├─dhclient

     ├─hald─┬─hald-runner─┬─hald-addon-acpi

     │      │             └─hald-addon-inpu

     │      └─{hald}

     ├─login───bash

     ├─master─┬─pickup

     │        └─qmgr

     ├─5*[mingetty]

     ├─rpc.statd

     ├─rpcbind

     ├─rsyslogd───3*[{rsyslogd}]

     ├─sshd───sshd───bash───pstree

     └─udevd───2*[udevd]

ps命令用法:

ps :将某个时间点的进程运行情况选取下来

                 

根据进程启动时是否是通过终端上的用户接×××互式启动的,进程可分为两类:

与终端相关的进程: a

与终端无关的进程: x

以用户为中心组织进程状态信息显示:u

 

s: session leader 会话进程的首进程

+: 前台进程,占据着某终端

l: 多线程进程

<: 高优先级进程

N: 低优先级进程

START: 启动时间

TIME:占据CPU累积时长

COMMAND:启动当前进程或线程的命令行程序,[]表示为内核线程;

 

常用选项组合2: -ef

-e: 显示所有进程;

-f: 显示丰富格式信息

 

常用选项组合3:-eFH

-F: 显示额外信息

-H: 以层级形式显示进程间关系;

 

自定义需要显示的信息:axo

ps axo pid,command,psr,pri,ni

psr: 当前进程运行的CPU编号;

pri: 当前进程的优先级;

ni: 当前进程的nice值;

-20, 19

pgrep: 过滤只显示指定信息

语法格式:pgrep [OPTIONS] "PATTERN"

-U UID:仅显示以指定用户身份运行的进程;

-G GID

-l: 显示PID和进程名;

pidof: 获取一个正在运行的程序的ID号

例:pidof /bin/bash

1

2

[root@bogon ~]# pidof /bin/bash

2476 1844

    

top命令用法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

[root@bogon ~]# top

top - 15:10:38 up  3:53,  2 users,  load average: 0.00, 0.00, 0.00

Tasks:  94 total,   1 running,  93 sleeping,   0 stopped,   0 zombie

Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.5%id,  0.2%wa,  0.0%hi,  0.1%si,  0.0%st

Mem:   1004352k total,   430648k used,   573704k free,    34504k buffers

Swap:  2097148k total,        0k used,  2097148k free,   287016k cached

 

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                 

  2985 root      20   0 15032 1092  828 R  2.0  0.1   0:00.05 top                                                                                                      

     1 root      20   0 19356 1536 1224 S  0.0  0.2   0:00.85 init                                                                                                     

     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                                                                 

     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                                                                              

     4 root      20   0     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/0                                                                                              

     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0                                                                                                

     6 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 watchdog/0                                                                                               

     7 root      20   0     0    0    0 S  0.0  0.0   0:12.81 events/0                                                                                                 

     8 root      20   0     0    0    0 S  0.0  0.0   0:00.00 cgroup                                                                                                   

     9 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper

第一行(top...):这一行显示的资讯分别为:

目前的时间,亦即是 14:34:29 那个项目;

开机到目前为止所经过的时间,亦即是 up 3:17 那个项目;

已经登入系统的使用者人数,亦即是 2 user项目;

系统在 1, 5, 15 分钟的平均工作负载。 batch 工作方式为负载小于0.7,代表的是 1, 5, 15 分钟,系统平均要负责运作几个程序(工作)的意思。 越小代表系统越闲置,若高于 1 得要注意你的系统程序是否太过繁复了。一般队列长度的合理区间:CPU颗数*0.7。uptime命令: 显示当前系统时间,运行时长,登录用户数及系统平均负载;

第二行(Tasks...):

显示的是目前程序的总量与个别程序在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值。

第三行(Cpus...):

显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 %wa ,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源喔! 另外,如果是多核心的设备,可以按下数字键‘1’来切换成不同 CPU 的负载率。

第四行与第五行:

表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的物理记内存实在不足!

第六行:这个是当在 top 程式当中输入指令时,显示状态的地方。

至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:

PID :每个 process 的 ID 6

USER:该 process 所属的使用者;

PR :Priority 的简写,程序的优先执行顺序,越小越早被执行;

NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;

VIRT:虚拟内存;

RES:常驻内存;

SHR:共享内存;

S:状态;

%CPU:CPU 的使用率;

%MEM:内存的使用率;

TIME+:累计使用CPU 时间;

COMMAND:命令行程序

 

P:以占据的CPU百分比大小排序;

M:以占据Memory空间大小排序;

T:CPU累积占用时间排序;

 

l: 是否显示系统负载行;

队列长度的合理区间:CPU颗数*0.7

uptime命令: 显示当前系统时间,运行时长,登录用户数及系统平均负载;

1

2

[root@bogon ~]# uptime

 15:11:33 up  3:54,  2 users,  load average: 0.00, 0.00, 0.00

t: 是否显示进程摘要信息及CPU负载状态;

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

us: user space

运行用户程序所占据的CPU百分比

sy: system (kernel space)

 运行内核程序所占据的CPU百分比

ni: nice

调整nice值之后影响到的CPU百分比

id: idle

空闲CPU百分比

wa: wait io

等待I/O完成占据CPU的百分比

hi: hardware interrupt

处理硬件中断占据的CPU百分比

si: software interrupt

处理软件中断占据的CPU百分比

st: stolen

被虚拟化技术“偷走”CPU的百分比

一般us:sy为7:3最佳

1:平均或单独显示CPU的负载状态;

m: 是否显示内存相关的状态信息;

 

q: 退出命令

s: 修改延迟时长

k: 终止指定进程

 

top命令的选项:

-b: batch,批次显示

-n #: 显示的批次数量

-d #: 指明延迟时长

htop命令用法:

    wKiom1UuDnHSWohGAAbM5KzdjGw180.jpg

F1 帮助信息

F2 设置

F3 搜索

F4 过滤

F5 以树状结构显示

F6 按什么排序

F7/F8 设置NICE值

F9 终止进程

F10 退出

 

u: 过滤仅显示选定用户的进程;[左侧会出现选项栏]

s: 跟踪选定的进程所发起的系统调用;[选定一个进程按s键]

l: 显示选定进程所打开的文件;[选定一个进程按l键]

t: 显示进程的层次结构,与F5一样;[选定一个进程按t键]

a: 设定进程的cpu亲缘性;(将选定的进程绑定在指定的CPU上)

 

      选项:

-d #: 延迟时长

-u USERNAME: 仅显示指定用户的进程;

-s COLUMN: 根据指定的字段进行排序;

mvstat命令用法:

查看虚拟内存的使用

vmstat -s 显示内存的状态统计信息


进程相关(procs) 的项目分别为:

r:等待运作中的程序数量即等待运行的进程的个数;(队列长度)

b:不可被唤醒的程序数量即处理不可中断睡眠状态的进程的个数;(即IO阻塞队列长度)

这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多程序就无法被执行或一直在等待而无法被唤醒之故)。

内存(memory) 项目分别为:

swpd: 交换内存使用量;

free: 空间的物理内存量;

buffer: 用于缓冲的内存总量;

cache: 用于缓存的内存总量;

内存交换空间(swap) 的项目分别为:

si: 数据进入swap中的速率(kb/s)

so: 数据离开swap的速率(kb/s)

如果si/so的数值太大,意味着物理内存不够用了,表示内存中的资料常常得在磁盘和内存之间传来传去,系统效率会很差。

磁盘读写(io) 的项目分别为:

bi: 从块设备读入数据到系统的速率(kb/s)

bo: 保存数据至块设备的速率(kb/s)

如果这部份的值越高,代表系统中有进程的I/O非常忙碌。

系统(system) 的项目分别为:

in:每秒被中断的程序次数;

cs:每秒钟进行的事件切换次数;

这两个数值越大,代表系统与周边设备的沟通非常频繁! 这些周边设备当然包括磁盘、网卡、时钟等。

CPU 的项目分别为[top中有详细介绍]:

us:非核心层的 CPU 使用状态;

sy:核心层所使用的CPU 状态;

id:闲置的状态;

wa:等待 I/O所耗费的 CPU 状态;

st:被虚拟机器(virtual machine) 所盗用的 CPU 使用状态。


glances命令用法[epel]:

进程查看工具

wKioL1UuGfqTRp4_AAPtrogSzvo043.jpg

      常用选项:

-b: 以Byte/s为单位显示网卡设备数据交换速率;

-d: 关闭磁盘I/O功能模块;

-f /PATH/TO/SOMEFILE:设置输出文件的位置及格式;把

-o HTML|CSV:使用HTML/CSV格式

-m: 关闭mount功能模块

-n: 关闭网络功能模块

-r: 关闭进程列表功能模块

-t #: 指定延迟时长,默认为3秒;

-1:单独显示每颗CPU相关负载数据信息;


glances支持远程模式:

  即可以以C/S模式工作:

      Server: 以监听模式启动glances;

      Client: 以远程模式启动glances,远程连入指定服务器,并显示Server上的相关性能数据;

     

  服务模式:

    glances -s -B 本地IP地址

      -B: 用于指明监听的本地地址;

     

  客户端模式:

    glances -c 服务器IP地址

      -c: 用于连入的服务器的地址;

例:   在192.168.1.108上执行glances -s -B 192.168.1.108

在192.168.1.106上执行glances -c 192.168.1.108

注意:可能由于防火墙的原因无法连接



dstat命令用法:

统计系统资源数据的多用途工具,整合了vmstat, iostat, netstat and ifstat四款工具的功能;

 

-g: 显示page相关的速率数据;

-i: 显示interrupt相关的速率数据;

-l: 显示loadaverage相关的统计数据;

-m: 显示memory相关的统计数据;

-n: 显示网络收发数据的速率;

-p: 显示进程相关的统计数据;

-r: io请求的速率;

-s: 显示swap的相关数据;

-y: 显示系统相关的数据,包括中断和进程切换;

 

--top-cpu:显示最占用CPU的进程;

--top-bio:显示最消耗blockio的进程;

--top-io:最占用io的进程;

--top-mem:显示最占用内存的进程;

 

--ipc: 显示进程间通信相关的速率数据;

--raw: 显示raw套接的相关的数据;

--tcp: 显示tcp套接字的相关数据;

--udp: 显示udp套接字的相关数据;

--unix: 显示unixsock接口相关的统计数据;

--socket:显示套接字,相当于--raw --tcp --udp一起使用

 

-a:显示CPU,磁盘,网络,页面,系统相关信息,相当于-cdngy


kill命令用法:

IPC: 进程间通信

  常见形式:

    message queue

    semerphore

    shared memory

    signal

   

signal: 传递给进程的短小信息

Linux主机支持的进程间可用到的信息:

(1)kill -l   [上面jobs有描述]

(2)man 7 signal

 

向进程发信号:

kill[-SIGNAL] PID

默认的信号为SIGTERM;

 

信号表示:

1 完整名称,SIGINT

2 简写名称,INT

3 数据代称,2

常用信号:

SIGHUP

1

通知进程重读其配置文件以让新的配置生效,但不用重新启动进程

SIGINT

2

打断正在运行中的进程,相当于键盘组合键Ctrl+c

SIGKILL

9

强行中止正在运行中的进程

SIGTERM

15

安全中止正在运行中的进程

SIGSTOP

19

暂停进程

SIGCONT

18

运行指定进程

kill相似的一组进程:

killall[-SIGNAL] PROGRAM


进程优先级调整:

   静态优先级:

通过指定进程的nice值来调整其优先级;用户空间运行的进程一般都有其nice值;

通过虚拟机nice值: -20,19

他们的 优先级:  100, 139