一 CPU 性能监控工具

1 vmstat ,系统自带

查看CPU总核数 :
linux 系统运维小工具

linux 系统运维小工具

procs 列 :
r 列: 表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU核数,说明CPU不足,需要增加CPU,其中的CPU指的是逻辑CPU

b 列表示在等待的资源的进程数目


memory列:
swpd:是内存切换到交换分区的量(单位为k),如果swpd值不为0,或者较大,只要si so 长期为0,不会影响系统性能
free 表示当前空间的物理内存数量(单位为k)
buff 表示buff chache 的内存数量,一般对块设备的读写才要缓冲
cache 表示page cached 的内存数量,一般作为文件系统的cached,频繁访问的文件都会被放入cached中,当物理内存过小或不够使用时,其会释放


swap列:
si : 每秒由交换分区写入内存的大小
so :每秒由内存写入交换分区的大小

如果内存足够使用,则交换分区的写入和写出都为0,只有当这两个值长期大于0,则表示系统内存不够。


IO 列:
BI :表示从块设备读入数据的总量(即读磁盘)(块/s)
BO:表示写入块设置的数据总量(即写磁盘)(块/s)


system 列: 显示采集间隔内发生的中断数
in 列表示在某一时间间隔内观察到每秒设备中断数
cs 列表示每秒产生的上下文切换次数
如果这两个值比较大,表示内核消耗CPU比较厉害


CPU列: 显示了CPU的使用状态
us: 用户进程消耗CPU的时间百分比,如果长期大于50%,则需要优化程序算法

sy: 显示了系统(内核)进程消耗CPU的时间百分比,如果大于80%,则说明可能CPU资源不足

id : 显示了CPU 处于空闲时间的百分比

wa :显示了IO 等待所占用的CPU时间百分比,如果长期高于20%,则有问题

可选参数及扩展:

参数选项 解释说明
-a 显示活跃和非活跃期内存
-f 显示从系统启动至今的fork 进程数量
-m 显示slab信息
-n 只在开始时显示一次个字段的名称
-s 显示内存相关统计信息及多种系统活动数量(重点)
-d 显示磁盘相关统计信息
-p 显示指定磁盘分区统计信息
-S 使用指定单位显示,有k,K,m,M,分别代表1000,1024,1000000,1048576字节,默认单位为k(重点)
-t 统计信息带上时间戳

范例 1
linux 系统运维小工具_第1张图片

3 表示3秒间隔
5 表示显示5次
inact 表示非活跃的内存大小
active 表示活跃的内存大小

范例2 显示内存详细信息
linux 系统运维小工具_第2张图片

范例3 查看磁盘读/写
linux 系统运维小工具_第3张图片

2 iostat 需要安装

iostat 是I/O statistics(输入/输出)的缩写,其主要功能是对系统磁盘I/O操作进行监视,它的主要是显示磁盘读写操作的统计信息,同时也会给出CPU的使用情况。

linux 系统运维小工具_第4张图片

语法格式 
iostat  [选项]     [ 时间间隔  [次数]]
参数选项 解释说明
-c 显示CPU的使用情况
-d 显示磁盘的使用情况
-k 每秒以kB为单位显示数据
-m 每秒以MB 单位显示数据
-n 显示NFS 的使用情况
-t 显示每次统计执行的时间
-p device 指定要统计的磁盘设备名称,默认为所有磁盘
-x 显示扩展统计

linux 系统运维小工具_第5张图片

%user :用户进程消耗CPU时间百分比
%nice:改变优先级的进程占用CPU时间百分比
%system: 系统内核进程消耗的CPU时间百分比
%iowait:IO等待所占中的CPU时间百分比
%steal:虚拟机强制CPU等待时间百分比
%idle: CPU空闲状态的时间百分比

linux 系统运维小工具_第6张图片

tps:表示该设备每秒传输次数,一次传输的意思是一次I/O请求,多个逻辑请求可能会被合并成一次I/O请求

Blk_read/s:表示每秒读取的数据块数
Blk_wrtn/s:表示每秒写入的数据块数
Blk_read: 表示读取的所有块数
Blk_wrtn: 表示写入的所有块数

只显示磁盘信息
linux 系统运维小工具_第7张图片

linux 系统运维小工具_第8张图片

rrqm/s:每秒进行merge 的读操作的数目
wrqm/s:每秒进行merge 的写操作数据
r/s : 每秒完成的读I/O 设备次数
w/s:每秒完成的写I/O设备的次数
rKB/s:每秒读入的千字节数
wKB/s: 每秒写入的千字节数
avgrq-sz: 设备平均每次进行I/O操作的数据大小(扇区)
avgqu-sz:平均I/O队列长度
await:设备平均每次I/O操作的等待时间
svctm: 设备平均每次I/O操作的等待时间
%util:每秒中用于I/O操作的百分比

3 uptime 命令

uptime (选项)

-V 显示指令的版本信息

实例
linux 系统运维小工具
linux 系统运维小工具

内容说明:
15:07:32 系统的当前时间
up 14min ,表示系统已经运行的时间
1 user 表示用户的链接数,是总链接数
load average 表示系统平均负载,统计最近1,5,15 分钟平均负载
系统的平均负载是指在特定时间内运行队列的平均进程数。

如果每个CPU内核的当前活动进程数不大于3.表示系统性能是良好的,如果大于5,则说明性能严重有问题

sar 收集系统信息

通过sar 命令,可以全面的获取CPU,运行队列,磁盘I/O、分页(交换区)、内存、CPU中断和网络等性能数据

语法格式
sar [选项] [时间间隔 [次数]]

说明:
在sar 命令及后面的选项中,每个元素之间至少要有一个空格

参数说明

参数选项 解释说明
-A 显示系统所有资源设备的运行情况
-u 显示系统所有CPU在采样时间内的负载状态
-P 显示当前系统中指定CPU的使用情况
-d 显示所有硬盘设备在采样时间内的使用情况
-r 显示在采样时间内系统内存的使用情况
-b 显示在采样时间内缓冲区的使用情况
-v 显示索引节点、文件和其他内核表的状态
-n 显示网络运行状态
-q 显示运行队列的大小,它与系统当前的平均负载相同
-R 显示进程在采样时间内的活动情况
-w 显示系统交换活动在采样时间内的状态

安装软件包
linux 系统运维小工具_第9张图片
查看CPU相关信息:
linux 系统运维小工具_第10张图片

kbmemfree : 空闲物理内存量
kbmemused: 使用中的物理内存量
%memused: 物理内存的使用率
kbbuffers: 内存中作为缓冲区使用的物理内存容量
kubcached:内核中作为缓存使用的物理内存容量
%xommit:应用程序当前的内存大小占大小的使用百分比

显示缓冲区的使用情况:
linux 系统运维小工具_第11张图片

tps: 每秒物理设备的I/O传输总量
rtps:每秒从物理设备读入的数据总量
wtps:每秒向物理设备写入的数据总量
bread/s:每秒从物理设备读入的数据量,单位为块/s。
bwrtn/s:每秒向物理设备写入的数据量,单位同上

显示网络的运行状态

linux 系统运维小工具_第12张图片

IFACE:网络接口
rxpck/s:每秒中接受的数据包
txpck/s:每秒中发送的数据包
rxkB/s: 每秒钟接受的字节数
txkB/s:秒钟发送的字节数
rxcmp/s:每秒中接受的压缩数据包
txcmp/s:秒钟发送的压缩数据包
rxmcst/s:每秒中接受的多播数据包

显示网络错误的统计数据
linux 系统运维小工具_第13张图片

IFACE:网络接口
rxerr/s: 每秒中接受的坏数据包
txerr/s:每秒钟发生的坏数据包
coll/s:每秒的冲突数
rxdrop/s: 因为缓冲充满,每秒钟丢弃的已经接收的数据包数
txdrop/s:因为缓冲充满。每秒中丢弃已经发送的数据包数
txcarr/s: 发送数据包时,每秒载波错误数
rxfram/s:每秒接受数据包的帧对其错误数
rxfifo/s: 接受的数据包每秒FIFO过速的错误数
txfifo/s: 发送的数据包每秒FIFO过速的错误数。

显示套接字信息
linux 系统运维小工具_第14张图片

totsck:使用套接字总数量
tcpsck: 使用TCP套接字数量
udpsck:使用UDP套接字数量
rawsck:使用raw 套接字数量
ip-frag:使用IP段数量
tcp-tw:处于TIME_WAIT状态的TCP套接字数量

查看系统磁盘读写性能
linux 系统运维小工具_第15张图片

DEV: 表示磁盘设备名称
tps: 表示该设备每秒的传输次数
rd_sec/s: 表示每秒从设备读取的扇区数
wr_sec/s:表示每秒写入设备的扇区数目
avgrq-sz:设备平均每次I/O操作的数据大小(扇区)
avgqu-sz:平均I/O队列长度
await:设备平均每次I/O操作的等待时间(毫秒)
svctm:设备平均每次I/O操作的服务时间(毫秒)
%util: 每秒用于I/O操作的百分比

二 网络管理命令

1 tcpdump

tcpdump 命令是一个截获网络数据包的包分析工具,tcpdump可以将网络中传送的数据包的[头]完全截获下来分析,它支持针对网络层,协议,主机,端口等的过滤,并支持与、或、非逻辑语句协助过滤有效信息

tcpdump命令工作是要先把网卡的工作模式切换到混杂模式,因为要修改网络接口的工作模式,因此tcpdump命令需要以root的身份运行

tcpdump [选项] [表达式]

参数说明

参数选项 解释说明
-A 以ASCII 码方式显示每一个数据包,在抓取数据包时,可方面查看数据
-c <数据包数目> 接受指定的数据包数目后退出命令
-e 每行的打印输出中将包含数据包的数据链路层头部信息
-i <网络接口> 指定要监听数据包的网络接口
-n 不进行DNS解析,加快显示速度
-nn 不将协议和端口数字等转换成名字
-q 以快速的方式运行,此选项仅显示数据包的协议概要信息,输出信息较短
-s <数据包大小> 设置数据包抓取长度,如果不设置则默认为68字节,设置为0则自动选择合适的长度来抓取数据包
-t 在每行输出信息中不显示时间戳标记
-tt 显示当前行与前一行的延迟
-tttt 在每行打印的时间戳之前添加日期
-v 显示命令执行的详细信息
-vv 显示比-v 选项更加详细的信息
-vvvv 显示更加相信的输出

1 安装TCPDUMP
linux 系统运维小工具_第16张图片

实例 :
linux 系统运维小工具_第17张图片

-i 指定监听的端口
-c 指定监听数据包的数量
16:52:50 当前时间,精确到微秒
IP 192.168.3.21.54680 > server6.ssh:从具体数据包的信息和>表示流向
flags[.] :TCP 包中的标志信息,S是SYN标志的缩写,F(fIN),P(PUSH),R(RST),[.] 没有标记
seq: 数据包中的数据的顺序号
ack:下次期望的顺序号
win: 接受缓存的窗口大小
length:数据包长度

监听固定的IP地址
linux 系统运维小工具_第18张图片
监听固定的端口号
linux 系统运维小工具_第19张图片

监听指定协议的数据包
linux 系统运维小工具_第20张图片
常见协议:IP,arp、icmp、tcp、udp 等

2 nmap

网络探测工具/端口扫描器
nmap 命令是一款开放源代码的网络探测和安全审核工具,是network mapper 的缩写,器设计目标i是快速地扫描大型网络,nmap 可以发现网络上有那些主机,主机提供了什么服务,并探测操作系统的类型及版本信息

软件安装
linux 系统运维小工具_第21张图片
nmap [扫描类型] [通用选项] {扫描目标}

扫描目标可以为IP地址或子网地址等

参数说明

参数选项 解释说明
-sS TCP 同步扫描TCP SYN)
-sT TCP链接扫描
-sn 不进行端口扫描,只检查主机正在运行,该选项与老板不的-sP相同
-sU 扫描UDP端口
-sV 探测服务器版本信息
-Pn 只进行扫描,不ping主机
-PS 使用SYN包对目标主机进行扫描,默认是80端口,也可以指定端口,格式为-PS22或-PS22-25,80,53等,PS和端口号之间没有空格
-PU 使用UDP ping 扫描端口
-O 激活对TCP/IP指纹特征的扫描,获得远程主机的标志,也就是操作系统类型
-v 显示扫描过程的详细信息
-S 设置扫描的源IP地址
-g port 设置扫描的源端口
-oN 把扫描的结果重定向到文件中
-iL filename 从文件中读取扫描的目标
-p<端口> 指定要扫描的端口,可以是一个单独的端口,也可以是用逗号分隔开的多个端口,或者使用"_"表示端口范围
-n 不进行DNS解析,加快扫描速度
--exclude 排除指定主机
--excludefile 排除指定文件中的主机

查看主机当前开放的端口
linux 系统运维小工具_第22张图片
扫描主机的特定端口
linux 系统运维小工具_第23张图片

扫描一个网段
linux 系统运维小工具_第24张图片

3 ping

ping 命令可用于测试主机之间网络的连同性,执行ping 命令会使用ICMP传输协议,发送要求回应的消息,若远端网络功能没有问题,就会回应该信息,

ping [选项] [目标主机]

参数选项 解释说明
-c <次数> 指定发送ICMP报文的次数,否则将一直发送
-i <时间间隔> 相邻两次发送报文的时间间隔,默认时间间隔是1s
-n 不查询主机名,直接显示IP地址
-q 只显示命令开始时的信息和运行结束时的统计信息,忽略命令运行过程中出现的信息
-s<数据包大小> 设置发送数据包的大小,默认大小为56字节,再加上8字节ICMP头部,一共是64字节ICMP包
-t <生存期> 设置发送的数据包其生存期(TLL)的值
-w 截止时间 超过截止时间,立即退出ping程序
-W 超时时间 等待相应的超时时间

linux 系统运维小工具_第25张图片

-c 3:发送3次ICMP包
-i 3:每次发包的时间间隔为3s
-s 1024: 设置发送的数据包大小为1024字节
-t 220,设置发送数据包的ttl值为220

4 curl 命令

三 Linux 进程管理命令

1 top

top 命令用于实时地对系统处理器状态进行监控,它能够实时的显示系统中各个进程的资源占用情况,该命令可以按照CPU的使用,内存的使用和执行时间对系统的任务进行排序显示,同时top 命令还可以通过交互式命令进行设定显示

top [选项]

后跟命令

参数选项 解释说明
-b 以批处理的模式显示进程信息,输出结果可以传输给其他程序或写入到文件中,这种模式下,top命令不会接受任何输入,一站式运行到直到达到-n选项设置的阈值,或ctrl+C终止
-c 显示进程的整个命令路径,而不是只显示命令名称
-d 指定每两次屏幕信息刷新之间的时间间隔
-H 指定这个可以显示每个线程的情况,否则就是进程的总情况
-i 不显示闲置或僵尸的进程信息
-n top 输出信息的更新次数
-p 显示指定的进程信息

交互式命令
交互式命令就是在top命令执行过程中使用的一些命令:

交互式命令 含义
h 或 ? 显示帮助信息,给出交互式命令的一些说明总结
Z 全局颜色设置
B 全局字体加粗设置
l(小写L) 切换是否显示平均负载和启动时间信息
t 切换是否显示进程和CPU状态信息
m 切换是否显示内存信息
1(数字1) 用于多核CPU监控,可监控每个逻辑CPU的运行状况
I Irix/sokaris 模式
f 从当前显示列表中添加或删除项目,按"f"键之后会显示列的列表,按"a-z"键即可显示或隐藏对应的列,最后按回车键确定
o 该表top 输出信息中显示项目的顺序,按大小写的a-z 键可以将相应的列向右移动,而按大写的A-Z键可以将相应的列向左移动,最后按回车键确定
F或O 选择排序的列
<,> 移动选择排序的列。'<' 选择左临一列排序,'>'选择右临一列排序
R 切换正常/反转顺序
H 切换是否显示线程信息
c 切换是够显示完整命令行和命令名称信息
i 切换是够显示闲置进程和僵尸进程
S 切换到累计模式
x 以高亮的形式排序对应列,需要结合b/z 使用
y 高亮运行的进程,需要结合b/z 使用
z 打开/关闭颜色
b 打开/关闭加粗
u 显示指定用户相关的进程信息
n或# 设置显示进程的最大行数
k 终止一个进程,系统将提示用户输入一个需要终止进程的PID
r 重新设置一个进程的优先级,系统提示用户输入需要该变的进程PID,以及需要设置的优先级值,输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先级,默认值是10
d或s 改变top输出信息两次刷新的时间,系统将提示输入新的时间,单位为s,如果是小数,则换算成ms,如果是0,则系统不停刷新,默认刷新时间是3s,如果设置太小,则可能会造成系统负载过大
W 将当前top 设置写入"~/.toprc"文件中
q 退出top显示

显示说明
linux 系统运维小工具_第26张图片

第一行:任务队列信息,同uptime命令执行结果


第二行:tasks为任务(进程),系统现有进程115个,处于运行状态的1个,正在休眠的114个,stoped状态0个,zombie(僵尸)的0个


第三行:CPU状态信息
us 用户占用CPU比例
sy 内核占用cpu比例
ni 改变过优先级的进程占用CPU的百分比
id 空闲CPU的百分比
wa I/O等待占用CPU的百分比
ni 硬中断(hardware IRQ)占用CPU的百分比
si 软中断software interrupt)占用CPU的百分比
st 虚拟机占用CPU的百分比


第四行:内存状态
total 物理内存总量
used 使用中的内存总量
free 空闲内存总量
buffers 缓冲的内存总量


第五行:swap 交换分区信息
total 交换分区总量
used 使用的交换分区量
free 空闲的交换分区量
cached 缓存的内存量


第六行: 空行


第七行:各进程的状态监控
PID : 进程ID
USER: 进程所有者
PR:进程优先级
NI :nice 值,负值表示高优先级,正值表示低优先级
VIRT: 进程使用的虚拟内存总量。单位为kb
RES: 进程使用的、未被换出的物理内存发小,单位为kb
SHR:共享内存大小,单位为kb
S: 进程状态,D= 不可中断的睡眠状态、 R= 运行、 S=睡眠 、T =跟踪/停止 、 Z=僵尸进程
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位为1/100秒
COMMAND 进程名称(命令名/命令行)

2 ps

ps命令用于列出执行ps命令时刻的进程快照,要想动态信息,就需要使用top命令

ps [选项]

参数选项 解释说明
-a 显示所有终端下执行的进程
a 显示与终端相关的所有进程,包含每个进程的完整路径
x 显示与终端无关的所有进程
u 显示进程的用户信息
-u 显示指定用户相关的进程信息
-e 显示所有进程
-f 额外显示UID,PID,C与STIME 的栏位
f 显示进程树
-H 显示进程树
-I 以详细的格式来显示进程的状态
-o 自定义输出指定的字段,以逗号分隔
--sort key key表示为指定字段排序,默认为升序,+key为升序,-key 为降序

linux 系统运维小工具

PID 是进程的标识号
TTY 是进程所属的终端控制台
TIME 列是进程所使用的总的CPU时间
CMD 列是正在执行的命令行

linux 系统运维小工具_第27张图片

UID:进程拥有者
PID:进程标识号
PPID: 进程父进程标识号
C: CPU 使用资源百分比
STIME:进程开始时间
TTY: 该进程是在哪个终端机上面运行,若与终端机无关,则显示[?],另外,tty1-tty6是本机面的登录者进程,若为pts/0,则表示有网络连接进主机的进程
TIME: 进程所使用的总的CPU时间
CMD:正在执行的命令行

常用组合命令
linux 系统运维小工具_第28张图片

USER :该进程所属的用户
PID: 进程的进程号
%CPU:该进程使用掉的CPU百分比
%MEM:该进程所占用的物理内存的百分比
VSZ: 该进程使用掉的虚拟内存量(单位kbytes)
RSS: 该进程占用的固定的内存量(单位为kbytes)
TTY: 该进程是在哪个终端机上运行
STAT: 该进程目前状态
R: 正在运行
S: 正在睡眠或者可以运行
D: 不可中断睡眠
T: 正在侦测或者是停止了
Z :已经终止,但是其父进程无法正常终止他,从而编程僵尸进程
+: 前台进程
I: 多线程进程
N:低优先级进程
<:高优先级进程
s: 进程领导者
L:已将页面锁定到内存中

START:该进程被触发启动的时间
TIME:该进程实际使用的CPU运作的时间
COMMAND: 该进程的实际命令

以详细格式显示进程状态
linux 系统运维小工具

参数详解:
F:代表这个进程的标志,4 代表使用者为super user。
S:代表这个进程的状态为stat
C:代表CPU使用率百分比
PRI: 优先级
NI:nice值
ADDR:指出该进程在内存的那个部分,如果是个running,则一般是[-]
SZ: 使用掉的内存大小
WCHAN: 目前这个进程是否正在运行中,若是则为[-]

3 kill 和killall

终止进程
kill [选项] [进程号]

参数选项 解释说明
-l 列出全部信号名称
-p 指定kill 命令只打印相关的进程号,而不发送任何信号
-s 指定要发送的信号

linux 系统运维小工具_第29张图片
可以使用-l(小写L)进行参数信号和数字信号之间的转换
linux 系统运维小工具

常用信号说明

信号 说明
HUP(1) 挂起,通常因终端掉线或用户退出而引发的
INT(2) 中断,通常是按下CTRl+c组合键来发出这个信号
QUIT(3) 退出,通常是按下CRTL+\组合键发出此信息号
kill(9) 立即结束进程的运行
TERM(15) 终止,通常在系统关机时发送
TSTP(20) 暂停进程运行,通常是按下CTRL+Z组合键发出这个信号

kill 默认使用的信号为15,用于结束进程,如果进程忽略此信号,可以使用信号9强制终止进程

在kill中有一个特殊信号值为0,其中-0 表示不发送任何信号,但仍然会对对应的进程进行检查,如果$pid对应的进程已经存在,则返回0,否则返回1

killall 通过进程名终止进程

killall [选项] [进程名]

参数选项 解释说明
-e 对于很长的名字,要求能够准确匹配,默认,如果一个进程名的长度超过了15个字符,则无法使用整个名字了,这种情况下,killall会终止所有匹配名字前15个字符的所有进程,而-e参数的作用是模糊匹配,如果同时指定了-v选项,则killall会针对每个忽略的记录打印一条消息
-I 不区分大小写匹配
-g 终止属于该进程组的进程
-i 在终止进程之前询问是否确认
-q 如果没有进程终止则不提示
-r 使用正则表达式匹配要终止的进程名称
-s 用指定的信号代替默认信号
-u 终止指定用户的进程
-v 报告信号是否发送成功
-w 等待所有被终止的进程死去,killall 每秒会检查一次被终止的进程是否仍然存在,其仅在都死光后才返回。

4 ulimit

1 简介

ulimit 最初设计是用来限制进程对资源的使用情况,因为早期的系统资源包括内存/CPU都是非常有限的,系统要保持公平,就要限制每个进程的使用,以达到一个相对公平的环境。

2 基本参数说明

下面是典型机器的默认限制情况:

[root@slave1 ~]# ulimit  -a 
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 11858
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 11858
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

这个默认配置在Linux上一直沿用了十几年,而在这十几年里,硬件已经有了很大的变化,而软件的限制来时没有变化,这会导致出现一些问题,上面输出中,最重要的就是文件句柄的使用(ulimit -n),可以看出,默认的文件句柄是1024,这个值对应web类的服务器/数据库类的应用程序,太小了,因为这些应用都需要大量的文件句柄,一旦文件句柄设置太小,应用系统就会出现资源被限制的情况,最终导致应用系统出现问题,或者变成不可用。

参数 含义
-a 显示当前系统所有的limit资源信息
-H 设置硬资源限制,一旦设置不能增加
-S 设置软资源限制,设置后面可以增加,但是不能超过硬资源设置
-c 设置core文件的大小,以blocks 为单位
-f 进程可以创建文件的最大值,以blocks为单位
-d 进程最大的数据段大小,以Kbytes为单位
-m 最大内存大小,以Kbytes为单位
-n 可以打开的最大文件描述符的数量
-s 线程栈大小,以Kbytes为单位
-p 管道缓冲区大小,以Kbytes为单位
-u 用户最大可用的进程数
-v 进程最大可用的虚拟内存,以Kbytes为单位
-t 最大CPU占用时间,以秒为单位
-l 最大可加锁内存大小,以Kbytes为单位

3 配置方式

在使用ulimit时,有一下几种使用方法:
1 在用户环境变量中加入

如果用户是使用bash,那么就可以在用户目录的环境变量文件.bashrc或.bash_profile中加入'ulimit -u 128' 来限制用户最多可以使用128个进程


2 在应用程序的启动脚本中加入
如果应用程序是tomcat,那么就可以在tomcat的启动脚本startup.sh中加入'ulimit -n 65535'来限制用户最多可以使用65535个文件描述符


3 直接在shell 命令中断执行ulimit 命令,这种方式的资源限制仅仅在命令执行的终端生效,在退出或关闭终端后,设置失效,并且不会影响其他shell终端


4 在配置启动文件中加入(centos/redhat 7中可以)
在[service]中配置
LimitNOFILE=65536


5 有时候问了方便期间,也可以将用户资源的限制统一由一个文件来配置,这个文件就是/etc/security/limits.conf ,但该文件不但能对指定用户的资源进行限制,还嫩对指定组的资源进行限制,格式如下

        

其中:
domain 表示用户或组的名字,可以使用*作为通配符,表示任何用户或用户组

type: 表示限制的类型,可以有两个值,soft和hard,分别表示软,硬资源限制

item: 表示需要限定的资源的名称,常用的有nofile,cpu,stack,noproc等,分别表示最大打开文件句柄数,占用CPU时间,最大的堆栈大小和最大用户进程数。

value:表示限制各种资源的具体数值


6 /etc/security/limits.d/ 目录,可以将资源限制创建一个文件放置到这个目录中,默认系统会首先读取这个目录下的所有配置文件,然后才去读取limits.conf 文件,在所有资源限制设置完成后,退出shell终端,再次登陆shell终端后,ulimit 设置可自动生效。


7 在centos 系统中,在cat /etc/security/limits.d/20-nproc.conf 中设置了默认值,而如果在/etc/security/limits.conf 文件中也设置了nproc值的话,则会被覆盖。


8 在centos/redhat7中/etc/security/limits.conf 只适用于通过PAM认证登陆用户的资源限制,而对于systemd的service的资源限制不生效,要使其生效,需要将其加入到/etc/systemd/system.conf(CENTOS7)或 /etc/systemd/user,conf.d/.conf两个对应目录中所有的.conf 文件,其中system.conf时全局配置文件,user.conf是用户级别使用的配置文件,对于一般的service,可使用system.conf中的配置即可

DefaultLimitNOFILE=655360
DefaultLimitNPROC=655360

4 ulimit 使用总结

1 ulimit 生效规则

A 在设置进程的资源限制的时候,需要同时设置软限制和硬限制,超出软规则会进行警告,但不能超过硬限制。


B 一般线上服务器的应用,推荐在/etc/security/limits.conf 文件中进行资源的设置,设置完成后,要保证设置生效,需要退出原来的终端,在新的终端中重启系统服务,这样才能生效。

2 nofile与 noproc

nofile 用来打开最大句柄数,noproc用来设置最大用户进程数,这两个是最长用到的参数,nofile不能设置过大.

[root@slave1 limits.d]# ulimit  -n unlimited
-bash: ulimit: open files: 无法修改 limit 值: 不允许的操作

这个问题是由内核导致的,在Linux kernel 2.6.25之前通过ulimit -n 设置每一个进程的最大打开文件句柄数不能超过1024*1024,也就是1048576,要提高这个值,只能 重新编译内核,而在Linux kernel 2.6.25之后,内核提供了一个sys接口可以修改这个最大值,可以通过修改 /proc/sys/fs/nr_open的值来动态提高最大打开文件句柄数。

[root@slave1 limits.d]# cat /proc/sys/fs/nr_open 
1048576
[root@slave1 limits.d]# ulimit  -n  1048576
[root@slave1 limits.d]# ulimit  -n  
1048576
[root@slave1 limits.d]# ulimit  -n  1048577
-bash: ulimit: open files: 无法修改 limit 值: 不允许的操作
[root@slave1 limits.d]# echo  1100000  > /proc/sys/fs/nr_open 
[root@slave1 limits.d]# ulimit  -n  1048577
[root@slave1 limits.d]# ulimit  -n  
1048577

上面的操作是在centos7.5系统上完成的,通过修改这个数量可以影响打开文件句柄数的大小了


noproc 是操作系统级别对每个用户创建的进程数的限制,在Linux下运行多线程时,每个线程的实现其实时一个轻量级的进程,怎么知道一个用户创建了多少个进程,默认的ps命令不是显示全部的进程的,需要'-L'才能看到所有的进程

[root@slave1 ~]# ps -Led    -o user |  sort  | uniq  -c   | sort -rn 
    202 root
     23 mysql
     10 heketi
      7 polkitd
      3 redis
      2 postfix
      1 USER
      1 rpc
      1 nobody
      1 dbus
      1 chrony

5 CENTOS/RHEL7中ulimit 资源限制问题

在centos/redhat7中/etc/security/limits.conf 只适用于通过PAM认证登陆用户的资源限制,而对于systemd的service的资源限制不生效,要使其生效,需要将其加入到/etc/systemd/system.conf(CENTOS7)或 /etc/systemd/user,conf.d/.conf两个对应目录中所有的.conf 文件,其中system.conf时全局配置文件,user.conf是用户级别使用的配置文件,对于一般的service,可使用system.conf中的配置即可,也就是在/etc/systemd/system.conf中添加如下内容:

DefaultLimitNOFILE=655360
DefaultLimitNPROC=655360

注意: 修改了system.conf后,需要重启系统才能生效
针对单个service,也可以直接修改配置文件,马上生效,配置如下

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=655360
LimitNPROC=655360

重启服务并生效

systemctl daemon-reload 
systemctl start nginx 

linux 系统运维小工具_第30张图片