回顾:

nmcli

nmtui


system-config-network[-tui]


进程管理:

所谓进程:process,一个活动的程序实体的副本;

生命周期;

可能包含一个或多个执行流;


创建进程:

每个进程的组织结构是一致的;


内核在正常启动并且全面接管硬件资源之后,会创建一个Init的进程;而这个名叫init的进程负责用户空间的进程管理;


CentOS5及以前:SysV Init,Classic Init

有缺陷:在启动系统时,Init通过写脚本的方式来创建各个子进程;利用shell来实现,因此其执行速度非常慢;导致系统的启动速度和进程的创建速度都非常慢;


CentOS6:upstart,有Ubuntu研发的新型的Init进程;可以并行的启动某些有关联的服务进程,在创建进程的时候,可以多线创建进程;如果有多个CPU或这有多颗CPU核心的话,其进程的创建速度会有比较明显的变化;第一个进程名称仍然是init;


CentOS7:Systemd,参考了MAC OS的启动逻辑开发一款新版的init程序;其可以以其自身独立完成整个操作系统的启动工作;也就是说,在开机并加载内核之后,只需要启动一个systemd进程就可以将其他各服务进程启动起来,从而引导整个系统启动;


/sbin/init

/sbin/systemd


除了init进程之外,其他的各个进程都是由其父进程创建的;


由fork()系统调用来实现的;


每个父进程通过fork()系统调用,复制自身的数据给子进程使用;这种复制方式不是立即复制,而是写时复制(CoW);


终止进程:

任何父进程创建的子进程都必须由父进程亲自销毁;


任何的进程的父子关系都保存在task struct中;


进程优先级:

0-139

1-99:实时优先级,数字越大优先级越高;在系统启动时启动的进程;

100-139:静态优先级,数字越小优先级越高;在用户执行某些应用程序的时候启动的进程;


nice值:

-20~19:默认的nice值0;


只有管理员才能使用负整数的nice值,以提升进程的优先级;

而普通用户只能使用正整数的nice值,以降低进程的优先级;


划分了140个进程队列;


Big O标准:

O(1),O(logN),O(N),O(N^2),O(2^N)


进程的类型:

按照进程的启动方式:

守护进程:

Daemon,通常是在系统引导的过程被启动的,与任何的终端无关;也可以通过终端启动;

用户进程:

用户登录到系统之后,通过终端启动的进程;


按照进程的运行位置:

前台进程:

在进程启动之后,进程一直占用标准输出或者标准输入或者同时占用标准输出和标准输入;

后台进程:

在进程启动之后,进程不占用标准输出和标准输入;


按照进程对于资源消耗:

CPU-Bond:非交互式的进程;

IO-Bond:编辑器等各种交互式进程;



Linux系统上与进程有关的命令(查看命令和管理类命令):

pstree, ps, pidof, pgrep, pkill, top, htop, glances, dstat, pmap, vmstat, bg, fg, jobs, kill, killall, nohup, nice, renice, ....


pstree:

pstree - display a tree of processes


ps:

ps - report a snapshot of the current processes.(报告当前进程的快照)


ps [options]


1   UNIX options, which may be grouped and must be preceded by a dash.

2   BSD options, which may be grouped and must not be used with a dash.

3   GNU long options, which are preceded by two dashes.


常用选项:

BSD风格的选项:

a:显示所有与终端相关的进程;

x;显示所有与终端无关的进程;

u:显示发起进程的用户的账户名称;


常用的选项组合之一:aux


ps aux命令显示的结果中各字段的含义:

USER:进程的所有者

PID:进程标识符

%CPU:进程占用的CPU处理时间的百分比;

%MEM:进程占用的物理内存的百分比;

VSZ:虚拟内存集(可交换内存集)

RSS:常驻内存集

TTY:进程与哪个终端相关;?表示与终端无关;

STAT:

R:running,正在运行的进程;

S:interuptible sleeping,可中断的睡眠状态;

D:uninteruptible sleeping,不可中断的睡眠状态;Disk Block;

T:Trace/STOPPED,被跟踪/已停止;

Z:Zombie,僵死态;

+:前台进程

l:包含多线程的进程

<:高优先级进程

N:低优先级进程

s:session leader,有子进程的父进程;

START:进程开始执行的时间戳

TIME:进程累计的CPU占用时间;

COMMAND:启动进程的命令行参数;


UNIX风格的选项:

-e:显示所有进程

-f:显示完整格式的进程信息

-F:显示完整格式的进程信息,与-f几乎相同;


常用的选项组合之二:-ef

PPID:父进程PID

C:表示进程占用的CPU时间的百分比


常用的选项组合之三:-eF

SZ:虚拟内存集

RSS:常驻内存集

PSR:表示此进程在哪个CPU核心上运行;


-H:以层级机构显示进程的父子关系;

常用的选项组合之四:-eFH


o|-o field1,field2,...:以自定义字段的方式显示进程相关信息;

field:pid, ppid, ni, rtprio, psr, pcpu, stat, comm, user, tty, vsz, rss,...


常用的选项组合之五:-eo | axo field1,field2,...


pgrep,pkill:

pgrep, pkill - look up or signal processes based on name and other attributes


根据进程名称或其他属性查看进行或向进程发送信号;

pgrep [options] pattern

pkill [options] pattern


常用选项:

-u uid:显示进程的有效用户

-U uid:显示进程的真实用户

-t TERM:显示与指定的终端相关的进程

-l:显示进程名称

-a:显示进程的完整的命令行参数


pidof:

显示指定进程名称对应的进程ID;


top:

top - display Linux processes

top首部:

第一行:uptime信息:

当前系统时间

系统的运行时长

当前登录系统的用户总数 

过去的1分钟,5分钟,15分钟的在CPU上等待运行的进程队列的平均长度;


第二行:

系统中运行的进程总数

正在运行的进程数

处于睡眠状态的进程数

已停止的进程数

僵死态的进程数


第三行:CPU时间占用百分比

us:user space,用户空间的进程占用的CPU时间的百分比

sy:system,内核空间的内核进程占用的CPU时间的百分比

ni:nice,使用nice值调整了进程优先级之后额外多占用的CPU时间百分比;

id:idle,CPU空闲时间的百分比;

wa:waiting,等待IO完成所消耗的CPU时间的百分比

hi:hardware interupting,处理硬件中断事件所消耗的CPU时间的百分比;

si:software interupting,处理软件中断事件所消耗的CPU时间的百分比;

st:stolen,被虚拟化程序等偷走的CPU时间的百分比;


第四行:以KB为单位显示物理内存空间的使用情况;

total:物理内存空间的总大小

free:空闲的物理内存空间大小

userd:已经被使用的物理内存空间大小

buffer/cache:缓冲区和缓存区消耗的物理内存空间大小;这段内存空间随时可以回收,不算真正的消耗;

avail mem:真正可用的内存空间大小;


第五行:以KB为单位显示swap空间的使用情况:

total:

used:

free:


交互式命令:

1:显示或隐藏CPU核心信息

P:根据CPU占用百分比进行排序

M:根据物理内存占用百分比进行排序

T:根据累计CPU占用时间进行排序

l:关闭或显示uptime信息

t:关闭或显示第二、第三行信息

m:关闭或显示第四、第五行信息

q:退出top交换模式

s:修改top的刷新时间间隔

k:终止某个指定PID的进程的运行


常用的选项:

-d #:指定top刷新的时间间隔,默认是3秒;

-b:按批次显示进程信息

-n #:通常与-b选项一起使用,表示显示多少批;










回顾:

计算机系统的静态组成:

进程的概念

进程的调度方法

进程的创建和终止

进程优先级

进程的分类

进程管理的相关命令:

pstree,ps,pgrep,pidof,top


vmstat

vmstat - Report virtual memory statistics报告虚拟内存的统计信息


vmstat [options] [delay [count]]



其结果中的内容:

Procs

       r: The number of runnable processes (running or waiting for run time).(可运行进程的数量(运行或等待运行时))

       b: The number of processes in uninterruptible sleep.不间断睡眠中进程的数目


    Memory

       swpd: the amount of virtual memory used.

       free: the amount of idle memory.

       buff: the amount of memory used as buffers.

       cache: the amount of memory used as cache.用作缓存的内存量

       inact: the amount of inactive memory.  (-a option)

       active: the amount of active memory.  (-a option)


    Swap

       si: Amount of memory swapped in from disk (/s).

       so: Amount of memory swapped to disk (/s).


    IO

       bi: Blocks received from a block device (blocks/s).

       bo: Blocks sent to a block device (blocks/s).


    System

       in: The number of interrupts per second, including the clock.

       cs: The number of context switches per second.


    CPU

       These are percentages of total CPU time.

       us: Time spent running non-kernel code.  (user time, including nice time)

       sy: Time spent running kernel code.  (system time)

       id: Time spent idle.  Prior to Linux 2.5.41, this includes IO-wait time.

       wa: Time spent waiting for IO.  Prior to Linux 2.5.41, included in idle.等待io的时间。在Linux2.5.41之前,包括在idle中

       st: Time stolen from a virtual machine.  Prior to Linux 2.6.11, unknown.从虚拟机中被盗的时间。在Linux2。6。11之前未知

  r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。


b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。


swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。


free   空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。


buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M


cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)


si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。


so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。


bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒


bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。


in 每秒CPU的中断次数,包括时间中断


cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。


us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。


sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。


id  空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。


wa 等待IO CPU时间。

st:从虚拟机中被盗的时间

  选项:

  -s:从/proc/meminfo文件中抽取的信息并加工后输出;


  delay:按照deley所指示的时间重复执行vmstat命令,默认单位为秒;

  count:重复执行vmstat命令的次数;


pmap:

pmap - report memory map of a process(报告进程的内存映射)


pmap [options] pid [...]


选项:

-x,--extended:显示扩展的信息


htop,glances,dstat


http://mirrors.sohu.com/fedora-epel/$releasever/$basearch/


htop:

htop - interactive process viewer交互式进程查看器


htop [-dChusv]


常用选项:

-d #:htop刷新的间隔时间;

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

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


交互式命令:

l:显示指定进程打开的文件列表;

t F5:显示进程树结构,以显示进程之间的父子关系;

a:将选定的进程绑定到某指定的CPU核心运行;


glances:

glances - A cross-platform curses-based monitoring tool


glances  [-bdmn1] [-t refresh] [-f file] [-o output]


常用选项:

-b:以KByte为单位显示网卡的数据速率;

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

-m:关闭Mount模块;

-n:关闭Network模块;

-1:单独显示每颗CPU核心的数据统计信息;

-t #:设定刷新时间间隔;

-o {HTML|CSV}:为输出数据指定输出的格式;

-f /PATH/TO/OUTPUT_DIR:指定输出文件的路径,glances.html


glances可以工作于C/S模型下:

S:服务器模式

glances -s -B IPADDR

IPADDR:服务器本地的某个IP地址;


C:客户端模式

glances -c IPADDR

IPADDR:远程服务器指定监听的IP地址;


进程之间可以通信的;IPC,Inter-Process Communication

1.signal

2.semaphore

3.shared memory (SHM)


4.socket


dstat:

dstat - versatile tool for generating system resource statistics


dstat [-afv] [options..] [delay [count]]


常用选项:

-c, --cpu:显示CPU相关的信息;

-d, --disk:显示磁盘相关信息;

-g, --page:显示page相关信息;

-n, --net:显示与Interface相关信息;

-y, --sys:显示与系统相关的信息;

--tcp:显示与TCP连接状态相关的信息;

--udp:显示与UDP连接有关的信息;

--ipc:

--raw:

--socket:

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

--top-io:显示最占用IO的进程;


进程管理类:

kill, pkill, killall


kill:

kill - terminate a process终止一个进程


kill [-s signal | -signal] pid...


查看信号的信息:

kill -l [signal]


有效的信号表示方法:

1.使用信号的数字编码进行表示

2.使用信号的完整名称进行表示

3.使用信号的简写名称进行表示,简写名称就是完整名称中不包含"SIG"的其余部分;


常用的信号:

1) SIGHUP:无需关闭对应进程而让其重新读取其自身的配置文件;

2) SIGINT:终止正在运行的前台进程;

9) SIGKILL:没有任何预兆的终止正在运行的进程,残暴;

15) SIGTERM:默认信号,终止正在运行的进程;

18) SIGCONT:让转入后台的进程继续运行;

19) SIGSTOP:让进程转入后台并停止运行;


killall:

killall - kill processes by name


# killall PROCESS_NAME


pkill:

跟据pattern进行进程终止;有可能误伤其他进程;


进程作业管理命令:

jobs, bg, fg, nohup


进程作业:

前台作业:

foreground job,通过终端启动并且启动后会一直占据终端的进程;


后台作业:

background job,可以通过终端启动,但启动后立即转入后台运行,释放终端;


如何让作业工作于后台:

1.正在运行的前台作业:

Ctrl+z

注意:实际上是向此进程发送SIGSTOP信号,使得该进程转入后台以后即停止运行;


2.尚未启动的作业,使其启动并转入后台:

# COMMAND &

注意:此类作业是从前台启动,启动后立即转入后台,但即便如此,此进程也是与终端相关的进程;如果终端关闭,则此类进程也会终止;


3.尚未启动的作业,使其启动并转入后台,同时剥离其与终端的关联;

# nohup COMMAND &


查看后台作业的信息:

jobs


将后台作业转入前台运行:

fg [JOB_ID]


使后台作业在后台运行:

bg [JOB_ID]


终止后台作业:

kill %JOB_ID


kill %1


调整进程优先级的命令:

nice, renice


调整进程优先级:

0-139

100-139:


使用NICE值调整进程的静态优先级:

NICE值的取值范围是:-20~19

默认情况下,所有用户进程的初始NICE值都是0;默认优先级为120;


注意:只有超级用户root才能使用负NICE值提升进程的优先级;普通用户只能使用正NICE值来降低进程的优先级;


nice:启动进程的时候直接指定进程的NICE值;

nice - run a program with modified scheduling priority


nice [OPTION] [COMMAND [ARG]...]


选项:

-n NICE:指定NICE值


renice:针对于已经启动的进程修改其NICE值;

renice - alter priority of running processes


renice [-n] priority [[-p] pid ...]

选项:

-n NICE:调整指定的进程的优先级,在原有的NICE值的基础上,在加上此处指定的NICE值;


其他相关命令:sar, iostat, mpstat, pidstat, tsar, iftop, nethog...


Linux系统的进程调度(任务调度)


进程调度:在未来某个时间点,让系统自动执行我们事先编写好的命令或脚本的列表,从而使得即使用户不在计算机旁边也可以按时完成任务;


为了能够进行进程调度,就必须要有一种机制能够识别事件发生的时间并且能够运行用户所预期的命令;这种机制在Linux中是通过特定的守护进程来实现的;

这类守护进程包括:

atd:

将预先编写好的命令在未来某个时间点执行一次;

crond:

将预先编写好的命令在未来的符合条件的时间点重复执行;


查看此类守护进程是否正常运行:

CentOS6:

]# service {atd|crond} status


结果为running或者"正在运行",都表示其正常工作


CentOS7:

]# systemctl status {atd.service|crond.service}


结果为active(running)就表示其正常工作


所有的进程调度的结果都会以电子邮件的方式发送到用户的邮箱中;

本地电子邮件服务:

SMTP:Simple Mail Transfer Protocol,简单邮件传输协议,TCP/25

POP3:Post-Office Protocol Version 3,邮局协议第三版,TCP/110

IMAP4:Internet Mail Access Protocol Version 4,互联网邮件访问协议第四版,TCP/143


整个电子邮件系统分成四大部分:

MUA:Mail User Agent,邮件用户代理,帮助用户发送电子邮件到服务器或者帮助用户从服务器接收电子邮件的应用程序;

MTA,MDA,MRA


常用的MUA:

浏览器,Outlook,Foxmail,mail|mailx


mail [-s SUBJECT] USERNAME[@HOSTNAME]


/var/spool/mail/USERNAME就是每个用户的邮箱;


为了能够非交互式的发送邮件,可以使用输入重定向或管道;


atd守护进程能够识别和完成由at命令、batch命令制作的任务计划;


at命令:

at, batch, atq, atrm - queue, examine or delete jobs for later execution


at [option] TIME

TIME:

1.HH:MM [YYYY-mm-dd]

2.noon, midnight, teatime

3.tomorrow

4.now+#UNIT  UNIT:min, hours, days, weeks, months, years...


at定义的作业有队列的概念,通常队列使用单个字母来表示,默认是a;

at -q QUEUE_NAME TIME


选项:

-q QUEUE

-f FILE

-l:查看队列,相当于atq

-d JOB_ID:清除指定的计划作业,相当于atrm

-c:查看指定的作业的内容


batch命令:

batch命令在定义任务的时候,无需指定时间,是由系统自行选择在系统比较空闲的时候,完成此计划任务;其他的配置与at完全相同;


周期性执行任务计划:cron

cronie软件包,提供crond守护进程以及cron的其他管理工具;


cron任务通常分为两类:

系统cron任务:/etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/


# For details see man 4 crontabs


# Example of job definition:

# .---------------- minute (0 - 59)

# |  .------------- hour (0 - 23)

# |  |  .---------- day of month (1 - 31)

# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...

# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# |  |  |  |  |

# *  *  *  *  * user-name command to be executed


注意:

1.

*  *  *  *  *:定义周期执行任务的时间

user-name:运行此任务的用户账户身份;

command to be executed:应该执行的任务命令及命令行参数;

注意:为了保证任务能够准确执行,命令通常是用绝对路径填写;


2.各个字段之间使用一个或多个空白字符进行分隔;


3.任务运行的结果以邮件的方式直接发送给root用户;


用户cron任务:/var/spool/cron/USERNAME

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/


# For details see man 4 crontabs


# Example of job definition:

# .---------------- minute (0 - 59)

# |  .------------- hour (0 - 23)

# |  |  .---------- day of month (1 - 31)

# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...

# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# |  |  |  |  |

# *  *  *  *  *  command to be executed


注意:

1.

*  *  *  *  *:定义周期执行任务的时间

command to be executed:应该执行的任务命令及命令行参数;

注意:为了保证任务能够准确执行,命令通常是用绝对路径填写;


2.各个字段之间使用一个或多个空白字符进行分隔;


3.任务运行的结果以邮件的方式直接发送给发布任务的用户;


时间表示法:

1.特定时间:给定时间点的有效取值范围内的所有有效值;

0 5 3 9 *

2.通配符时间:*,表示"每..."之意,给定时间点的所有有效值;

* * * * *

3.离散时间:在给定的时间点上,使用逗号分隔;

0 8,20 * * 1,3,5

4.连续时间:在给定的时间点上,使用减号分隔;

0 8 * * 1-5

5.步长时间:在给定的时间点上,使用除号分隔;

*/2 * * * *

*/7 * * * * 此种方式无法实现每7分钟为间隔执行计划任务;


注意:

1.指定的步长必须能被时间点的数值整除,否则,无意义;

2.最小的时间单位是分钟,如果计划以秒为执行计划任务的时间单位,必须借助于其他机制;


crontab命令:

crontab - maintain crontab files for individual users

crontab [-u user] [-l | -r | -e] [-i]


-u USERNAME:超级用户为其他用户设置或编辑用户cron任务时使用;

-l:查看所有的已经被定义的计划任务

-e:使用vi编辑器编辑crontab文件;

-r:移除所有的计划任务;不推荐使用;

-i:在使用-r选项时,进行交互;