一 CPU 性能监控工具
1 vmstat ,系统自带
procs 列 :
r 列: 表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU核数,说明CPU不足,需要增加CPU,其中的CPU指的是逻辑CPUb 列表示在等待的资源的进程数目
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 | 统计信息带上时间戳 |
3 表示3秒间隔
5 表示显示5次
inact 表示非活跃的内存大小
active 表示活跃的内存大小
2 iostat 需要安装
iostat 是I/O statistics(输入/输出)的缩写,其主要功能是对系统磁盘I/O操作进行监视,它的主要是显示磁盘读写操作的统计信息,同时也会给出CPU的使用情况。
语法格式
iostat [选项] [ 时间间隔 [次数]]
参数选项 | 解释说明 |
---|---|
-c | 显示CPU的使用情况 |
-d | 显示磁盘的使用情况 |
-k | 每秒以kB为单位显示数据 |
-m | 每秒以MB 单位显示数据 |
-n | 显示NFS 的使用情况 |
-t | 显示每次统计执行的时间 |
-p device | 指定要统计的磁盘设备名称,默认为所有磁盘 |
-x | 显示扩展统计 |
%user :用户进程消耗CPU时间百分比
%nice:改变优先级的进程占用CPU时间百分比
%system: 系统内核进程消耗的CPU时间百分比
%iowait:IO等待所占中的CPU时间百分比
%steal:虚拟机强制CPU等待时间百分比
%idle: CPU空闲状态的时间百分比
tps:表示该设备每秒传输次数,一次传输的意思是一次I/O请求,多个逻辑请求可能会被合并成一次I/O请求
Blk_read/s:表示每秒读取的数据块数
Blk_wrtn/s:表示每秒写入的数据块数
Blk_read: 表示读取的所有块数
Blk_wrtn: 表示写入的所有块数
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 显示指令的版本信息
内容说明:
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 | 显示系统交换活动在采样时间内的状态 |
kbmemfree : 空闲物理内存量
kbmemused: 使用中的物理内存量
%memused: 物理内存的使用率
kbbuffers: 内存中作为缓冲区使用的物理内存容量
kubcached:内核中作为缓存使用的物理内存容量
%xommit:应用程序当前的内存大小占大小的使用百分比
tps: 每秒物理设备的I/O传输总量
rtps:每秒从物理设备读入的数据总量
wtps:每秒向物理设备写入的数据总量
bread/s:每秒从物理设备读入的数据量,单位为块/s。
bwrtn/s:每秒向物理设备写入的数据量,单位同上
显示网络的运行状态
IFACE:网络接口
rxpck/s:每秒中接受的数据包
txpck/s:每秒中发送的数据包
rxkB/s: 每秒钟接受的字节数
txkB/s:秒钟发送的字节数
rxcmp/s:每秒中接受的压缩数据包
txcmp/s:秒钟发送的压缩数据包
rxmcst/s:每秒中接受的多播数据包
IFACE:网络接口
rxerr/s: 每秒中接受的坏数据包
txerr/s:每秒钟发生的坏数据包
coll/s:每秒的冲突数
rxdrop/s: 因为缓冲充满,每秒钟丢弃的已经接收的数据包数
txdrop/s:因为缓冲充满。每秒中丢弃已经发送的数据包数
txcarr/s: 发送数据包时,每秒载波错误数
rxfram/s:每秒接受数据包的帧对其错误数
rxfifo/s: 接受的数据包每秒FIFO过速的错误数
txfifo/s: 发送的数据包每秒FIFO过速的错误数。
totsck:使用套接字总数量
tcpsck: 使用TCP套接字数量
udpsck:使用UDP套接字数量
rawsck:使用raw 套接字数量
ip-frag:使用IP段数量
tcp-tw:处于TIME_WAIT状态的TCP套接字数量
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 | 显示更加相信的输出 |
-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,arp、icmp、tcp、udp 等
2 nmap
网络探测工具/端口扫描器
nmap 命令是一款开放源代码的网络探测和安全审核工具,是network mapper 的缩写,器设计目标i是快速地扫描大型网络,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 | 排除指定文件中的主机 |
3 ping
ping 命令可用于测试主机之间网络的连同性,执行ping 命令会使用ICMP传输协议,发送要求回应的消息,若远端网络功能没有问题,就会回应该信息,
ping [选项] [目标主机]
参数选项 | 解释说明 |
---|---|
-c <次数> | 指定发送ICMP报文的次数,否则将一直发送 |
-i <时间间隔> | 相邻两次发送报文的时间间隔,默认时间间隔是1s |
-n | 不查询主机名,直接显示IP地址 |
-q | 只显示命令开始时的信息和运行结束时的统计信息,忽略命令运行过程中出现的信息 |
-s<数据包大小> | 设置发送数据包的大小,默认大小为56字节,再加上8字节ICMP头部,一共是64字节ICMP包 |
-t <生存期> | 设置发送的数据包其生存期(TLL)的值 |
-w 截止时间 | 超过截止时间,立即退出ping程序 |
-W 超时时间 | 等待相应的超时时间 |
-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显示 |
第一行:任务队列信息,同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 为降序 |
PID 是进程的标识号
TTY 是进程所属的终端控制台
TIME 列是进程所使用的总的CPU时间
CMD 列是正在执行的命令行
UID:进程拥有者
PID:进程标识号
PPID: 进程父进程标识号
C: CPU 使用资源百分比
STIME:进程开始时间
TTY: 该进程是在哪个终端机上面运行,若与终端机无关,则显示[?],另外,tty1-tty6是本机面的登录者进程,若为pts/0,则表示有网络连接进主机的进程
TIME: 进程所使用的总的CPU时间
CMD:正在执行的命令行
USER :该进程所属的用户
PID: 进程的进程号
%CPU:该进程使用掉的CPU百分比
%MEM:该进程所占用的物理内存的百分比
VSZ: 该进程使用掉的虚拟内存量(单位kbytes)
RSS: 该进程占用的固定的内存量(单位为kbytes)
TTY: 该进程是在哪个终端机上运行
STAT: 该进程目前状态
R: 正在运行
S: 正在睡眠或者可以运行
D: 不可中断睡眠
T: 正在侦测或者是停止了
Z :已经终止,但是其父进程无法正常终止他,从而编程僵尸进程
+: 前台进程
I: 多线程进程
N:低优先级进程
<:高优先级进程
s: 进程领导者
L:已将页面锁定到内存中START:该进程被触发启动的时间
TIME:该进程实际使用的CPU运作的时间
COMMAND: 该进程的实际命令
参数详解:
F:代表这个进程的标志,4 代表使用者为super user。
S:代表这个进程的状态为stat
C:代表CPU使用率百分比
PRI: 优先级
NI:nice值
ADDR:指出该进程在内存的那个部分,如果是个running,则一般是[-]
SZ: 使用掉的内存大小
WCHAN: 目前这个进程是否正在运行中,若是则为[-]
3 kill 和killall
终止进程
kill [选项] [进程号]
参数选项 | 解释说明 |
---|---|
-l | 列出全部信号名称 |
-p | 指定kill 命令只打印相关的进程号,而不发送任何信号 |
-s | 指定要发送的信号 |
常用信号说明
信号 | 说明 |
---|---|
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