centos Linux系统日常管理1 cpuinfo cpu核数 命令 w, vmstat, uptime ,top ,kill ,ps ,free,netstat ,sar, ulimit ,lsof ,pidof 第十四节课
上半节课
w
uptime
下半节课
top
kill命令
vmstat
ps
free
netstat
ulimit
sar
lsof
pidof
监控系统状态命令:w, vmstat, uptime ,top
w
# w
12:27:16 up 16 min (运行天数), 2 users (当前系统登录用户数 如果要删除某个用户可以查看有多少用户登录了系统),
load average: 0.06, 0.03, 0.00 单位时间段内CPU平均消耗 ,上两位数就要注意了
三个数分别代表不同时间段的系统平均负载(一分钟、五分钟、十五分钟)
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 12:26 5.00s 0.01s 0.00s -bash (本地用户)
root pts/0 192.168.0.101 12:26 0.00s 0.07s 0.00s w (远程用户)
注意:load average的最大值不可能超过CPU逻辑核数,比如8逻辑核CPU,load average不可能达到9.00 ,上两位数就要注意了!
每次远程连接Linux都会显示w命令信息
15:18:09 up 4 days, 21:19, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
steven pts/0 113.x.x.x 15:15 41.00s 0.01s 0.02s sshd: steven [priv]
steven pts/1 113.x.x.x 15:18 0.00s 0.01s 0.02s sshd: steven [priv]
ab(apache benchmark测试工具):测试apache
uptime
# uptime
14:43:50 up 2 days, 20:45, 1 user, load average: 0.00, 0.00, 0.00 ,上两位数就要注意了
下半节课
top
# top
top - 14:46:57当前时间 up 2 days, 20:48 已经运行了多少时间, 1 user, load average: 0.00, 0.00, 0.00 ,上两位数就要注意了
Tasks: 89 total 89个进程, 1 running, 88 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa io等待cpu, 0.0%hi, 0.0%si, 0.0%st
Mem: 1922484k total 2G内存, 449604k used, 1472880k free, 166384k buffers
Swap: 0k total 无swap, 0k used, 0k free, 173156k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19356 1492 1192 S 0.0 0.1 0:00.58 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
us:用户态
sy:内核态
wa:wait等待时间
id:空闲
ni:优先值
buffer:缓冲
cache:缓存
下面部分
PR:优先级
NI:NICE 优先值 -20~19 数值越小优先级越高,用户层概念 nice 值可调整的范围为 -20 ~ 19 # nice [-n 数字] command
VIRT:虚拟内存 RES+SWAP,包括mmap分配的内存http://mysql.taobao.org/monthly/2017/05/01/
RES:真正内存 没有被换出的, 要关注
SHR:共享内存
S:状态
%CPU:CPU百分比 top默认以CPU排序 8逻辑核CPU 当%CPU为800的时候 才说明CPU才完全占满
%MEM:内存百分比
TIME+:在CPU运行了多长时间
COMMAND:命令
用于动态监控进程所占系统资源,每隔3秒变一次。
RES 这一项为进程所占内存大小,而 %MEM 为使用内存百分比
按 “shift + m”, 可以按照内存使用大小排序。
按 “shift + p”, 可以按照CPU使用排序。
按数字 ‘1’ 可以列出各颗cpu的使用状态。
top -bn1 它表示非动态打印系统资源使用情况,可以用在shell脚本中
top -c 最右侧的命令可以显示更详细的信息 例如命令路径
kill命令
少使用 kill - 进程ID
尽量用 killall 进程名
w,uptime,top显示的第一行都是一样的
vmstat
#vmstat //每一秒打印一次
#vmstat //每一秒打印一次 打印十次后结束打印
-t参数:执行vmstat命令,该命令将会在每一行输出后都带一个时间戳 vmstat -t 1 5
-s参数:将输出各种事件计数器和内存的统计信息。 vmstat -s
-d参数:将会输出所有磁盘的统计信息。 vmstat -d
-S和-M参数:(大写和MB)将会以MB为单位输出。vmstat默认以KB为单位输出统计信息。 vmstat -S -M 1 5
vmstat各指标含义:
--proc进程相关-------------------------------------------------------------------------------
r :run 表示运行和等待cpu时间片的进程数,如果长期大于服务器cpu的个数,则说明cpu不够用了;
b :表示等待资源的进程数,比如等待I/O, 内存等,这列的值如果长时间大于1,则需要关注一下了
--swap 交换分区相关的---------------------------------------------------------------------------
si :由交换区进入内存的数量; swap--》内存
so :由内存进入交换区的数量;
--io 磁盘---------------------------------------------------------------------------------------
bi :从块设备读取数据的量(读磁盘); 磁盘--》内存
bo: 从块设备写入数据的量(写磁盘);
--system 系统相关的-----------------------------------------------------------------------
in : 每秒的软中断次数,包含时钟中断;
cs : 每秒的上下文切换次数;
--cpu cpu相关的-----------------------------------------------------------------------
wa :表示I/O等待所占用cpu时间百分比.
us :用户态
sy :内核态
id :空闲
--------------------------------------------------------------------------------------
ps
ps 查看系统进程 process show
-A 显示所有进程(等价于-e)(utility)
-a 显示一个终端的所有进程,除了会话引线
-C ps -C nginx 只显示某个程序的所有进程
-N 忽略选择。
-d 显示所有进程,但省略所有的会话引线(utility)
-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
-p pid 进程使用cpu的时间
-u uid or username 选择有效的用户id或者是用户名
-g gid or groupname 显示组的所有进程。
U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
-f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
-l 长格式(有F,wchan,C 等字段)
-j 作业格式
-o 用户自定义格式。
v 以虚拟存储器格式显示
s 以信号格式显示
-m 显示所有的线程
-H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
e 命令之后显示环境(如:ps -d e; ps -a e)(utility)
h 不显示第一行
ps aux / ps -elf
PID :进程的id,这个id很有用,在linux中内核管理进程就得靠pid来识别和管理某一个程,
比如我想终止某一个进程,则用 ‘kill 进程的pid’有时并不能杀掉,则需要加一个-9选项 kill -9 进程pid
ps aux
%CPU 进程的cpu占用率
%MEM 进程的内存占用率
VSZ 进程所使用的虚存的大小(Virtual Size)
RSS 进程使用的驻留集大小或者是实际内存的大小,单位 KB。
ps -eo ppid,pid,user,args |grep mysql
1 7348 root /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/mysql3306/data --pid-file=/data/mysql/mysql3306/tmp/mysql.pid
7348 8463 mysql /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/mysql3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysqlmysql3306/logs/error.log --pid-file=/data/mysql/mysql3306/tmp/mysql.pid --socket=/data/mysql/mysql3306/tmp/mysql.sock --port=3306
ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 3 0 0 ? -1 S 0 0:00 \_ [migration/0]
2 4 0 0 ? -1 S 0 0:18 \_ [ksoftirqd/0]
STAT :表示进程的状态,进程状态分为以下几种
D 不能中断的进程(通常为IO)
R 正在运行中的进程
S 已经中断的进程,系统中大部分进程都是这个状态
T 已经停止或者暂停的进程,如果我们正在运行一个命令,比如说 sleep 10 如果我们按一下ctrl -z 让他暂停,那么我们用ps查看就会显示T这个状态
X 已经死掉的进程(这个从来不会出现)
Z 僵尸进程,杀不掉,打不死的垃圾进程,占系统一小点资源,不过没有关系。如果太多,就有问题了,只能重启服务器解决。
< 高优先级进程
N 低优先级进程
L 在内存中被锁了内存分页
s 主进程
l 多线程进程
+ 在前台的进程
watchdog:监视非常重要的进程,发现死掉的话帮忙拉起重要进程
free
查看内存使用情况
-b 以Byte为单位显示内存使用情况。
-k 以KB为单位显示内存使用情况。
-m 以MB为单位显示内存使用情况。
-g 以GB为单位显示内存使用情况。
-o 不显示缓冲区调节列。
-s <间隔秒数> 持续观察内存使用状况。
-t 显示内存总和列。
-V 显示版本信息。
free 默认以k为单位显示
mem(total):内存总数;
mem(used):已经分配的内存; 并不是真正已用
mem(free):未分配的内存; 并不是真正剩余内存
mem(buffers):系统分配但未被使用的buffers;
mem(cached)系统分配但未被使用的cache
buffers/cache(used):实际使用的buffers与cache 总量,也是实际使用的内存;
buffers/cache(free):未被使用的buffers与cache和未被分配的内存之和,这就是系统 当前实际可用内存
buffers是即将要被写入磁盘的
cached是被从磁盘中读出来的
redhat7支持 free -h
系统启动的时候就会从内存拿出一部分内存作为buffers和cached
netstat
netstat 查看网络状况 三次握手 四次挥手
输出分为两部分:一个是TCP/IP网络部分,另一个是Unix socket部分
Unix socket是本机内的进程间通信,而且连接非常多
-n :显示ip ,不显示机器名
netstat -lnp 查看当前系统开启的端口以及socket,所有ip,比如十个ip,十个ip都监听
netstat -an 查看当前系统所有的连接状态
netstat -lntp 只有tcp,不列出socket
netstat -lnup 只有udp,不列出socket
netstat -an|awk '/ESTABLISHED/'|wc -l 检查机器并发
zabbix监听端口:10050
mysql监听端口:3306
nginx监听端口:80
stmp sendmail监听端口:25
sendmail和postifx都可以发邮件
sar
sysstat软件包包含sar、iostat、mpstat三个命令,iostat的cpu统计和磁盘统计跟sar命令差不多
sar查看网络状态 跟vmstat用法差不多 1 10 每隔一秒打印,打印10次结束
没有这个命令,使用 yum install -y sysstat
网卡流量 n:network DEV device sar -n DEV , sar -n DEV
读取指定文件数据,不加-f 默认显示今天凌晨到现在为止: sar -n DEV -f /var/log/sa/sa24
查看历史负载 sar -q ldavg 1分钟 5分钟 15分钟
查看磁盘读写 sar -b bread/s bwrtn/s
查看网络状态还有另外一个工具:iftop
记录文件需要开启sysstat服务:ls /etc/init.d/sysstat
查看cpu的个数和核数
cpu核数
cat /proc/cpuinfo
cat /proc/cpuinfo |grep 'core id'
processor :线程数 逻辑核心数 从0开始算 ,衡量性能
core id:核心数 物理核心数 从0开始算
cat /proc/cpuinfo |grep processor //只有一个逻辑核
processor : 0
cat /proc/cpuinfo |grep 'core id' //只有一个物理核
core id : 0
并发连接数不会超过65536 文件描述符 socket文件连接 最大65535
ulimit -n
# ulimit -a //腾讯云
core file size (blocks, -c)
data seg size (kbytes, -d) unlimited
scheduling priority (-e)
file size (blocks, -f) unlimited
pending signals (-i)
max locked memory (kbytes, -l)
max memory size (kbytes, -m) unlimited
open files (-n) //10W 关注
pipe size ( bytes, -p)
POSIX message queues (bytes, -q)
real-time priority (-r)
stack size (kbytes, -s)
cpu time (seconds, -t) unlimited
max user processes (-u) // 关注
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited STACK堆内存,mongodb连接默认采用这个配置,每个连接使用8192KB(8mb)/10240KB(10mb) 内存,连接一多,非常消耗内存
stack size (kbytes, -s) 8192 centos7
stack size (kbytes, -s) 10240 centos6
建议设置为1024,DefaultLimitSTACK==1024
ulimit -a //家里centos6
core file size (blocks, -c)
data seg size (kbytes, -d) unlimited
scheduling priority (-e)
file size (blocks, -f) unlimited
pending signals (-i)
max locked memory (kbytes, -l)
max memory size (kbytes, -m) unlimited
open files (-n)
pipe size ( bytes, -p)
POSIX message queues (bytes, -q)
real-time priority (-r)
stack size (kbytes, -s)
cpu time (seconds, -t) unlimited
max user processes (-u)
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
楼方鑫HZ(37223884) 17:24:34
起动onecache前要设一下ulimit -n
ulimit -n 16384
概述
系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的
条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。
ulimit 是一种 linux系统的内建功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。
本文将在后面的章节中详细说明 ulimit 的功能,使用以及它的影响,并以具体的例子来详细地阐述它在限制资
源使用方面的影响。
http://www.cnblogs.com/leaven/archive/2011/04/22/2024539.html
ulimit 的功能和用法
ulimit 功能简述
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,
这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就
会受到巨大的挑战。
而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常
紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非
常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运
行的性能有着密不可分的联系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现
资源限制的方式。
ulimit 用于限制 shell 所占用的资源,支持以下各种类型的限制:所创建的内核文件的大
小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开
文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使
用的最大虚拟内存。同时,它支持硬资源和软资源的限制。
作为临时限制,ulimit 可以作用于通过使用命令登录的 shell 会话,在会话终止时便结束限制,并
不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读
取的文件中,作用于特定的 shell 用户。
ulimit 通过一些参数选项来管理不同种类的系统资源。在本节,我们将讲解这些参数的使用。
ulimit 命令的格式为:ulimit [options] [limit]
具体的 options 含义以及简单示例可以参考以下表格。
表 1. ulimit 参数说明
选项 [options]
含义
例子
-H
设置硬资源限制,一旦设置不能增加。
ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
-S
设置软资源限制,设置后可以增加,但是不能超过硬资源设置。
ulimit – Sn 32;限制软资源,32 个文件描述符。
-a
显示当前所有的 limit 信息。
ulimit – a;显示当前所有的 limit 信息。
-c
最大的 core 文件的大小, 以 blocks 为单位。
ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。
-d
进程最大的数据段的大小,以 Kbytes 为单位。
ulimit -d unlimited;对进程的数据段大小不进行限制。
-f
进程可以创建文件的最大值,以 blocks 为单位。
ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
-l
最大可加锁内存大小,以 Kbytes 为单位。
ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes。
-m
最大内存大小,以 Kbytes 为单位。
ulimit – m unlimited;对最大内存不进行限制。
-n
可以打开最大文件描述符的数量。
ulimit – n 128;限制最大可以使用 128 个文件描述符。
-p
管道缓冲区的大小,以 Kbytes 为单位。
ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。
-s
线程栈大小,以 Kbytes 为单位。
ulimit – s 512;限制线程栈的大小为 512 Kbytes。默认值是8192KB,也就是8MB
linux里面一个线程一般占用多少内存
http://www.mongoing.com/archives/8781
针对每个连接,Mongod 会起一个单独的线程,专门负责处理这条连接上的请求,mongod 为处理连接请求的线程配置了最大1MB的线程栈,
通常实际使用在几十KB左右,通过 proc 文件系统看到这些线程栈的实际开销。
除了处理请求的线程,mongod 还有一系列的后台线程,比如主备同步、定期刷新 Journal、TTL、evict 等线程,
默认每个线程最大ulimit -s(一般10MB)的线程栈,由于这批线程数量比较固定,占的内存也比较可控。
-t
最大的 CPU 占用时间,以秒为单位。
ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。
-u
用户最大可用的进程数。
ulimit – u 64;限制用户最多可以使用 64 个进程。
-v
进程最大可用的虚拟内存,以 Kbytes 为单位。
ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。
我们可以通过以下几种方式来使用 ulimit:
在用户的启动脚本中
如果用户使用的是 bash,就可以在用户的家目录下的 .bashrc 文件中,加入 ulimit – u 64,
来限制用户最多可以使用 64 个进程。此外,可以在与 .bashrc 功能相当的启动脚本中加入 ulimt。
在应用程序的启动脚本中
如果用户要对某个应用程序 myapp 进行限制,可以写一个简单的脚本 startmyapp。
用户进程的有效范围
ulimit 作为对资源使用限制的一种方式,是有其作用范围的。那么,它限制的对象是单个用户,单个
进程,还是整个系统呢?事实上,ulimit 限制的是当前 shell 进程以及其派生的子进程。举例来说,
如果用户同时运行了两个 shell 终端进程,只在其中一个环境中执行了 ulimit – s 100,则该 shell
进程里创建文件的大小收到相应的限制,而同时另一个 shell 终端包括其上运行的子程序都不会受其影响:
Shell 进程 1
Shell 进程 2
ulimit 管理系统资源的例子
ulimit 提供了在 shell 进程中限制系统资源的功能。本章列举了一些使用 ulimit 对用户进
程进行限制的例子,详述了这些限制行为以及对应的影响,以此来说明 ulimit 如何对系统资源进行限制,从而达到调节系统性能的功能。
使用 ulimit 限制程序所能创建的 socket 数量
考虑一个现实中的实际需求。对于一个 C/S 模型中的 server 程序来说,它会为多个 client
程序请求创建多个 socket 端口给与响应。如果恰好有大量的 client 同时向 server 发出请
求,那么此时 server 就会需要创建大量的 socket 连接。但在一个系统当中,往往需要限制单
个 server 程序所能使用的最大 socket 数,以供其他的 server 程序所使用。那么我们如何
来做到这一点呢?答案是我们可以通过 ulimit 来实现!细心的读者可能会发现,通过前面章节的
介绍似乎没有限制 socket 使用的 ulimit 选项。是的,ulimit 并没有哪个选项直接说是用来
限制 socket 的数量的。但是,我们有 -n 这个选项,它是用于限制一个进程所能打开的文件描
述符的最大值。在 Linux 下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当
然也是文件。在 Linux 下创建一个新的 socket 连接,实际上就是创建一个新的文件描述符。如
下图所示(查看某个进程当前打开的文件描述符信息):
因此,我们可以通过使用 ulimit – n 来限制程序所能打开的最大文件描述符数量,从而
达到限制 socket 创建的数量。
每当一个新的线程被创建时都需要新分配一段大小为 1232KB (1MB)的内存空间
http://bbs.51cto.com/thread-1176284-1.html
问题描述:
生产环境发现CPU满负荷运行,MongoDB的连接数始终突破不了1000。
解决方案:
1、查看mongodb的日志,报下面的错误:
Wed Nov 21 15:26:09 [initandlisten] pthread_create failed: errno:11 Resource temporarily unavailable
Wed Nov 21 15:26:09 [initandlisten] can't create new thread, closing connection
2、在一台一样的centos5的机器上测试,发现连接2000个连接一点问题都没有。
3、上google查找问题,关键字“mongod.conf can’t create new thread, closing connection”
4、找到问题所在,原来centos6与之前centos5不同,多了一个默认的限制用户nproc的配置文件 :/etc/security/limits.d/90-nproc.conf ,默认把普通用户的nproc设置成1024,而mongodb正好又是使用mongod这个非root用户跑的,所以连接数一直上不去了。
5、更改/etc/security/limits.d/90-nproc.conf ,把1024改成20480 ,问题解决。
代码:
[root@test ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 20480
在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题;这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量。下面说的是,如何通过正解配置来改正这个系统默认值。
查看方法
我们可以用ulimit -a来查看所有限制值
代码:
[root@test ~]# 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) 256469
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 64000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 65536
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
其中 "open files (-n)"是Linux操作系统对一个进程打开的文件句柄数量的限制,默认是1024。
(也包含打开的SOCKET数量,可影响数据库的并发连接数目)。
正确的做法,应该是修改/etc/security/limits.conf
里面有很详细的注释,比如
hadoop soft nofile 32768
hadoop hard nofile 65536
hadoop soft nproc 32768
hadoop hard nproc 65536
就可以将文件句柄限制统一改成软32768,硬65536。配置文件最前面的是指domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制。
注意:这个当中的硬限制是实际的限制,而软限制,是warnning限制,只会做出warning;其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软
默认显示的是软限制,如果运行ulimit命令修改的时候没有加上的话,就是两个参数一起改变。
RHE6及以后 nproc的修改在/etc/security/limits.d/90-nproc.conf中
临时修改(当前shell下更改用户可打开进程数):
代码:
# ulimit -u xxx
永久修改, 保险的做法是同时修改/etc/security/limits.d/90-nproc.conf 和 /etc/security/limits.conf如下:
limits_conf = /etc/security/limits.conf:
* soft nproc s1
* hard nproc h1
nproc_conf = /etc/security/limits.d/90-nproc.conf:
* soft nproc s2
* hard nproc h2
s1,h1,s2,h2必须是具体有意义的数. 此时ulimit -u显示的值为=min(h1,h2)
因此通常就设置s1=s2=h1=h2, 例如在limits_conf和nproc_conf中同时加入:
* soft nproc 65536
* hard nproc 65536
username|@groupname type resource limit
username|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。
type:有 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比har 限制高。用 - 就表明同时设置了 soft 和 hard 的值。
resource:
core - 限制内核文件的大小
date - 最大数据大小
fsize - 最大文件大小
memlock - 最大锁定内存地址空间
nofile - 打开文件的最大数目
rss - 最大持久设置大小
stack - 最大栈大小
cpu - 以分钟为单位的最多 CPU 时间
noproc - 进程的最大数目
as - 地址空间限制
maxlogins - 此用户允许登录的最大数目
要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。查看 /etc/pam.d/login 文件中有:
session required /lib/security/pam_limits.so
暂时地,适用于通过 ulimit 命令登录 shell 会话期间。
永久地,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件之一(例如 ~/.profile),即特定于 shell 的用户资源文件;或者通过编辑 /etc/security/limits.conf。
何谓core文件,当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。 core文件是个二进制文件,需要用相应的工具来分析程序崩溃时的内存映像。
系统默认core文件的大小为0,所以没有创建。可以用ulimit命令查看和修改core文件的大小。
$ulimit -c
0
$ ulimit -c 1000
$ ulimit -c
1000
-c 指定修改core文件的大小,1000指定了core文件大小。也可以对core文件的大小不做限制,如:
# ulimit -c unlimited
#ulimit -c
unlimited
如果想让修改永久生效,则需要修改配置文件,如 .bash_profile、/etc/profile或/etc/security/limits.conf。
2.nofile - 打开文件的最大数目
对于需要做许多套接字连接并使它们处于打开状态的应用程序而言,最好通过使用 ulimit –n,或者通过设置nofile 参数,为用户把文件描述符的数量设置得比默认值高一些
用ulimit -n 2048 修改只对当前的shell有效,退出后失效:
如A程序已经运行,此时ulimit -n为1024;之后ulimit -n 2048,这时在运行B程序;退出当前shell用户,再次进行shell,之后运行C程序;这时只有B程序用的是2048,其它用的都是1024
lsof命令
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
各列解释
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。
lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
选项
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示所属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会递归搜索,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -p <pid> 查看指定进程打开的文件
lsof -i[46] [protocol][@hostname|@hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/services 中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
lsof |grep deleted ,显示文件系统中已经被删除的文件但是因为被引用所以还无法删除
lsof -i:36000,显示使用36000端口的进程
lsof -u root,显示以root运行的程序
lsof -c php-fpm,显示php-fpm进程打开的文件
lsof php.ini,显示打开php.ini这个文件的进程。
lsof -i :|grep -v "PID"|awk '{print "kil -9",$2}'|sh
grep -v "PID":去除行头
# lsof -i 4 查看IPv4类型的进程
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
exim4 2213 Debian-exim 4u IPv4 4844 TCP *:smtp (LISTEN)
dhclient3 2306 root 4u IPv4 4555 UDP *:bootpc
# lsof -i 6 查看IPv6类型的进程
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
exim4 2213 Debian-exim 3u IPv6 4820 TCP *:smtp (LISTEN)
# lsof -i @192.168.1.2 查看与某个具体的IP相关联的进程
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
amule 3620 root 16u IPv4 11925 TCP 192.168.1.2:42556->77.247.178.244:4242 (ESTABLISHED)
amule 3620 root 28u IPv4 11952 TCP 192.168.1.2:49915->118-166-47-24.dynamic.hinet.net:5140 (ESTABLISHED)
# lsof -i:873 根据进程号查看进程对应的可执行程序
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 702 root 4u IPv4 3792149 0t0 TCP *:rsync (LISTEN)
lsof -p 702 根据进程号查看进程对应的可执行程序
# lsof -p 702
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 702 root cwd DIR 252,1 4096 311297 /root
rsync 702 root rtd DIR 252,1 4096 2 /
rsync 702 root txt REG 252,1 410536 240090 /usr/bin/rsync
rsync 702 root mem REG 252,1 18712 147514 /lib64/libattr.so.1.1.0
rsync 702 root mem REG 252,1 154528 147463 /lib64/ld-2.12.so
rsync 702 root 0u CHR 1,3 0t0 3787 /dev/null 前三个文件描述符 标准输入 标准输出 标准错误 第四个开始文件描述符
rsync 702 root 1u CHR 1,3 0t0 3787 /dev/null
rsync 702 root 2u CHR 1,3 0t0 3787 /dev/null
rsync 702 root 4u IPv4 3792149 0t0 TCP *:rsync (LISTEN)
# lsof /usr/bin/rsync
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 702 root txt REG 252,1 410536 240090 /usr/bin/rsync
# lsof -u steven
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 19640 steven cwd DIR 252,1 4096 2 /
sshd 19640 steven rtd DIR 252,1 4096 2 /
sshd 19640 steven txt REG 252,1 567128 239837 /usr/sbin/sshd
sshd 19640 steven DEL REG 0,4 6892665 /dev/zero
sshd 19640 steven mem REG 252,1 18600 147602 /lib64/security/pam_limits.so
# lsof -c rsync
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 702 root cwd DIR 252,1 4096 311297 /root
rsync 702 root rtd DIR 252,1 4096 2 /
rsync 702 root txt REG 252,1 410536 240090 /usr/bin/rsync
rsync 702 root mem REG 252,1 18712 147514 /lib64/libattr.so.1.1.0
rsync 702 root mem REG 252,1 1921176 147470 /lib64/libc-2.12.so
rsync 702 root 0u CHR 1,3 0t0 3787 /dev/null
rsync 702 root 4u IPv4 3792149 0t0 TCP *:rsync (LISTEN)
lsof简介
http://blog.csdn.net/guoguo1980/article/details/2324454
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。
lsof使用
lsof输出信息含义
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 3,3 1024 2 /
init 1 root rtd DIR 3,3 1024 2 /
init 1 root txt REG 3,3 38432 1763452 /sbin/init
init 1 root mem REG 3,3 106114 1091620 /lib/libdl-2.6.so
init 1 root mem REG 3,3 7560696 1091614 /lib/libc-2.6.so
init 1 root mem REG 3,3 79460 1091669 /lib/libselinux.so.1
init 1 root mem REG 3,3 223280 1091668 /lib/libsepol.so.1
init 1 root mem REG 3,3 564136 1091607 /lib/ld-2.6.so
init 1 root 10u FIFO 0,15 1309 /dev/initctl
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识) 文件inode
NAME:打开文件的确切路径
FD 列表示文件描述符
cwd 表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。
txt 表示的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。
u 表示该其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,
其文件描述符为 10。
文件被打开并处于读取/写入模式,而不是只读或只写模式。同时还有大写的W表示该应用程序具有对整个文件的写锁。
该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,
从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。
Type 列表示文件类型
文件和目录分别称为 REG 和 DIR
CHR 和 BLK,分别表示字符和块设备
UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网络协议 (IP) 套接字
lsof常用参数
lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。
例如,linux限制了进程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某
个上限)。如果你怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。lsof语法格式是:
lsof [options] filename
常用的参数列表:
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示所属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会递归搜索,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -p <pid> 查看指定进程打开的文件
lsof -i[46] [protocol][@hostname|@hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/services 中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
lsof使用实例
一、查找谁在使用文件系统
在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:
# lsof /GTES11/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 4208 root cwd DIR 3,1 4096 2 /GTES11/
vim 4230 root cwd DIR 3,1 4096 2 /GTES11/
二、恢复删除的文件
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。
有时可以通过lsof来恢复这些文件。
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以像打开该文件时提供给它的文件描述符进行读取和写入。
除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点inode。
在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。
ll /proc/8775/exe
lrwxrwxrwx 1 root root 0 Mar 29 19:02 /proc/8775/exe -> /usr/sbin/sshd
当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:
# lsof |grep /var/log/messages
syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)
从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:
# head -n 10 /proc/1283/fd/2
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007
Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map:
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)
如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:
cat /proc/1283/fd/2 > /var/log/messages
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用
查找误删文件具体步骤
比如查找/var/log/messages
1、使用lsof查看/var/log下面的文件所用的文件描述符
lsof +D /var/log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
auditd 1138 root 5w REG 253,0 724625 1312257 /var/log/audit/audit.log
rsyslogd 1168 root 1w REG 253,0 1111 1312269 /var/log/messages
rsyslogd 1168 root 2w REG 253,0 55962 1312253 /var/log/cron
rsyslogd 1168 root 4w REG 253,0 1763 1312270 /var/log/secure
mcelog 1493 root 3w REG 253,0 0 1312155 /var/log/mcelog
zabbix_ag 2054 zabbix 1w REG 253,0 263546 1312233 /var/log/zabbix/zabbix_agentd.log
zabbix_ag 2054 zabbix 2w REG 253,0 263546 1312233 /var/log/zabbix/zabbix_agentd.log
zabbix_ag 2058 zabbix 1w REG 253,0 263546 1312233 /var/log/zabbix/zabbix_agentd.log
zabbix_ag 2058 zabbix 2w REG 253,0 263546 1312233 /var/log/zabbix/zabbix_agentd.log
2、找到使用/var/log/messages的进程的pid ,和/var/log/messages所使用的文件描述符次数 这里次数为1
ll /proc/1168/fd
total 0
lrwx------ 1 root root 64 Mar 25 11:00 0 -> socket:[10156]
l-wx------ 1 root root 64 Mar 25 11:00 1 -> /var/log/messages
l-wx------ 1 root root 64 Mar 30 10:24 2 -> /var/log/cron
lr-x------ 1 root root 64 Mar 25 11:00 3 -> /proc/kmsg
l-wx------ 1 root root 64 Mar 30 10:24 4 -> /var/log/secure
3、cat一下文件描述符为1的文件
cat /proc/1168/fd/1
Mar 28 10:37:01 steven rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1168" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Mar 28 11:49:21 steven fail2ban.filter[2075]: INFO Log rotation detected for /var/log/secure
Mar 28 12:40:12 steven kernel: e1000: eth0 NIC Link is Down
Mar 28 12:40:22 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Mar 28 13:36:27 steven kernel: e1000: eth0 NIC Link is Down
Mar 28 13:36:38 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Mar 28 18:24:48 steven yum[4880]: Installed: sysstat-9.0.4-27.el6.x86_64
Mar 28 19:13:41 steven kernel: e1000: eth0 NIC Link is Down
Mar 28 19:13:53 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Mar 29 12:34:14 steven kernel: e1000: eth0 NIC Link is Down
Mar 29 12:34:23 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Mar 29 19:01:57 steven kernel: e1000: eth0 NIC Link is Down
Mar 29 19:02:09 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
4、进行比较,发现确实是一样的
at /var/log/messages
Mar 28 10:37:01 steven rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1168" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Mar 28 11:49:21 steven fail2ban.filter[2075]: INFO Log rotation detected for /var/log/secure
Mar 28 12:40:12 steven kernel: e1000: eth0 NIC Link is Down
Mar 28 12:40:22 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Mar 28 13:36:27 steven kernel: e1000: eth0 NIC Link is Down
Mar 28 13:36:38 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Mar 28 18:24:48 steven yum[4880]: Installed: sysstat-9.0.4-27.el6.x86_64
Mar 28 19:13:41 steven kernel: e1000: eth0 NIC Link is Down
Mar 28 19:13:53 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Mar 29 12:34:14 steven kernel: e1000: eth0 NIC Link is Down
Mar 29 12:34:23 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Mar 29 19:01:57 steven kernel: e1000: eth0 NIC Link is Down
Mar 29 19:02:09 steven kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
5、备份下来
cat /proc/1168/fd/1> /var/log/messages
pidof命令
pidof 进程名
21852是libvirtd 进程的进程号
[root@gz]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5905 0.0.0.0:* LISTEN 21945/qemu-kvm
tcp 0 0 0.0.0.0:16509 0.0.0.0:* LISTEN 21852/libvirtd
tcp 0 0 0.0.0.0:9022 0.0.0.0:* LISTEN 1150/sshd
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 1173/python
tcp 0 0 0.0.0.0:6080 0.0.0.0:* LISTEN 1171/python
tcp 0 0 0.0.0.0:5903 0.0.0.0:* LISTEN 21977/qemu-kvm
tcp 0 0 :::9022 :::* LISTEN 1150/sshd
[root@gzy1]# pidof libvirtd
21852
f