
解决方法:
1、检查服务器是否正常运行,如果服务器没有正常运行,则需要重启服务器。
2、检查服务器的系统资源,如内存、CPU等,确保服务器的系统资源充足,以支持更多的连接。
3、检查Linux系统的进程数限制,如果进程数限制过低,可以通过修改/etc/security/limits.conf文件来提高进程数的限制。
4、检查服务器的网络配置,如果服务器的网络配置不正确,可能会导致服务器无法接受连接。
你可以使用 mpstat 单独查看每个处理器或者系统整体的活动,可以是每次一个快照或者动态更新。为了使用这个工具,你首先需要安装 sysstat:
# yum update &&yum install sysstat [基于 CentOS 的系统]
# aptitutde update &&aptitude install sysstat [基于 Ubuntu 的系统]
# zypper update &&zypper install sysstat[基于 openSUSE 的系统]
你可以在 Linux 中学习 Sysstat 和其中的工具 mpstat、pidstat、iostat 和 sar,了解更多和 sysstat 和其中的工具相关的信息。
安装完 mpstat 之后,就可以使用它生成处理器统计信息的报告。
你可以使用下面的命令每隔 2 秒显示所有 CPU(用-P ALL 表示)的 CPU 利用率(-u),共显示3次。
# mpstat -P ALL -u 2 3
示例输出:
Linux 3.19.0-32-generic (tecmint.com) Wednesday 30 March 2016 _x86_64_(4 CPU)
11:41:07 IST CPU%usr %nice%sys %iowait%irq %soft %steal %guest %gnice %idle
11:41:09 IST all5.850.001.120.120.000.000.000.000.00 92.91
11:41:09 IST04.480.001.000.000.000.000.000.000.00 94.53
11:41:09 IST12.500.000.500.000.000.000.000.000.00 97.00
11:41:09 IST26.440.000.990.000.000.000.000.000.00 92.57
11:41:09 IST3 10.450.001.990.000.000.000.000.000.00 87.56
11:41:09 IST CPU%usr %nice%sys %iowait%irq %soft %steal %guest %gnice %idle
11:41:11 IST all 11.600.121.120.500.000.000.000.000.00 86.66
11:41:11 IST0 10.500.001.000.000.000.000.000.000.00 88.50
11:41:11 IST1 14.360.001.492.480.000.000.000.000.00 81.68
11:41:11 IST22.000.501.000.000.000.000.000.000.00 96.50
11:41:11 IST3 19.400.001.000.000.000.000.000.000.00 79.60
11:41:11 IST CPU%usr %nice%sys %iowait%irq %soft %steal %guest %gnice %idle
11:41:13 IST all5.690.001.240.000.000.000.000.000.00 93.07
11:41:13 IST02.970.001.490.000.000.000.000.000.00 95.54
11:41:13 IST1 10.780.001.470.000.000.000.000.000.00 87.75
11:41:13 IST22.000.001.000.000.000.000.000.000.00 97.00
11:41:13 IST36.930.000.500.000.000.000.000.000.00 92.57
Average: CPU%usr %nice%sys %iowait%irq %soft %steal %guest %gnice %idle
Average: all7.710.041.160.210.000.000.000.000.00 90.89
Average: 05.970.001.160.000.000.000.000.000.00 92.87
Average: 19.240.001.160.830.000.000.000.000.00 88.78
Average: 23.490.171.000.000.000.000.000.000.00 95.35
Average: 3 12.250.001.160.000.000.000.000.000.00 86.59
要查看指定的 CPU(在下面的例子中是 CPU 0),可以使用:
# mpstat -P 0 -u 2 3
示例输出:
Linux 3.19.0-32-generic (tecmint.com) Wednesday 30 March 2016 _x86_64_(4 CPU)
11:42:08 IST CPU%usr %nice%sys %iowait%irq %soft %steal %guest %gnice %idle
11:42:10 IST03.000.000.500.000.000.000.000.000.00 96.50
11:42:12 IST04.080.000.002.550.000.000.000.000.00 93.37
11:42:14 IST09.740.000.510.000.000.000.000.000.00 89.74
Average: 05.580.000.340.850.000.000.000.000.00 93.23
上面命令的输出包括这些列:
CPU: 整数表示的处理器号或者 all 表示所有处理器的平均值。
%usr: 运行在用户级别的应用的 CPU 利用率百分数。
%nice: 和 %usr相同,但有 nice 优先级。
%sys: 执行内核应用的 CPU 利用率百分比。这不包括用于处理中断或者硬件请求的时间。
%iowait: 指定(或所有)CPU 的空闲时间百分比,这表示当前 CPU 处于 I/O *** 作密集的状态。
%irq: 用于处理硬件中断的时间所占百分比。
%soft: 和%irq相同,但是是软中断。
%steal: 虚拟机非自主等待(时间片窃取)所占时间的百分比,即当虚拟机在竞争 CPU 时所从虚拟机管理程序那里“赢得”的时间。应该保持这个值尽可能小。如果这个值很大,意味着虚拟机正在或者将要停止运转。
%guest: 运行虚拟处理器所用的时间百分比。
%idle: CPU 没有运行任何任务所占时间的百分比。如果你观察到这个值很小,意味着系统负载很重。在这种情况下,你需要查看详细的进程列表、以及下面将要讨论的内容来确定这是什么原因导致的。
运行下面的命令使处理器处于极高负载,然后在另一个终端执行 mpstat 命令:
# dd if=/dev/zero of=test.iso bs=1G count=1
# mpstat -u -P 0 2 3
# ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
# mpstat -u -P 0 2 3
最后,和 “正常” 情况下 mpstat 的输出作比较:
正如你在上面图示中看到的,在前面两个例子中,根据%idle的值可以判断 CPU 0 负载很高。
在下一部分,我们会讨论如何识别资源饥饿型进程,如何获取更多和它们相关的信息,以及如何采取恰当的措施。
Linux 进程报告
我们可以使用有名的ps命令,用-eo选项(根据用户定义格式选中所有进程) 和--sort选项(指定自定义排序顺序)按照 CPU 使用率排序列出进程,例如:
# ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu
上面的命令只会显示PID、PPID、和进程相关的命令、 CPU 使用率以及 RAM 使用率,并按照 CPU 使用率降序排序。创建 .iso 文件的时候运行上面的命令,下面是输出的前面几行:
一旦我们找到了感兴趣的进程(例如PID=2822的进程),我们就可以进入/proc/PID(本例中是/proc/2822) 列出目录内容。
这个目录就是进程运行的时候保存多个关于该进程详细信息的文件和子目录的目录。
例如:
/proc/2822/io:包括该进程的 IO 统计信息(IO *** 作时的读写字符数)。
/proc/2822/attr/current:显示了进程当前的 SELinux 安全属性。
/proc/2822/cgroup:如果启用了 CONFIGCGROUPS 内核设置选项,这会显示该进程所属的控制组(简称cgroups),你可以使用下面命令验证是否启用了 CONFIGCGROUPS:
# cat /boot/config-$(uname -r) | grep -i cgroups
如果启用了该选项,你应该看到:
CONFIG_CGROUPS=y
根据红帽企业版 Linux 7 资源管理指南第一到四章的内容、openSUSE 系统分析和调优指南第九章、Ubuntu 14.04 服务器文档Control Groups 章节,你可以使用cgroups管理每个进程允许使用的资源数目。
/proc/2822/fd这个目录包含每个打开的描述进程的文件的符号链接。下面的截图显示了 tty1(第一个终端) 中创建 .iso 镜像进程的相关信息:
上面的截图显示 stdin(文件描述符 0)、stdout(文件描述符 1)、stderr(文件描述符 2) 相应地被映射到 /dev/zero、 /root/test.iso 和 /dev/tty1。
在 Linux 中为每个用户设置资源限制
如果你不够小心、让任意用户使用不受限制的进程数,最终你可能会遇到意外的系统关机或者由于系统进入不可用的状态而被锁住。为了防止这种情况发生,你应该为用户可以启动的进程数目设置上限。
你可以在 /etc/security/limits.conf 文件末尾添加下面一行来设置限制:* hard nproc 10
第一个字段可以用来表示一个用户、组或者所有人(*), 第二个字段强制限制可以使用的进程数目(nproc) 为 10。退出并重新登录就可以使设置生效。
然后,让我们来看看非 root 用户(合法用户或非法用户) 试图引起 shell fork 炸d时会发生什么。如果我们没有设置限制, shell fork 炸d会无限制地启动函数的两个实例,然后无限循环地复制任意一个实例。最终导致你的系统卡死。
但是,如果使用了上面的限制,fort 炸d就不会成功,但用户仍然会被锁在外面直到系统管理员杀死相关的进程。
提示:limits.conf文件中可以查看其它 ulimit 可以更改的限制。
其它 Linux 进程管理工具
除了上面讨论的工具, 一个系统管理员还可能需要:
a) 通过使用 renice 调整执行优先级(系统资源的使用)。这意味着内核会根据分配的优先级(众所周知的 “niceness”,它是一个范围从-20到19的整数)给进程分配更多或更少的系统资源。
这个值越小,执行优先级越高。普通用户(而非 root)只能调高他们所有的进程的 niceness 值(意味着更低的优先级),而 root 用户可以调高或调低任何进程的 niceness 值。
renice 命令的基本语法如下:
# renice [-n] <new priority><UID, GID, PGID, or empty>identifier
如果 new priority 后面的参数没有(为空),默认就是 PID。在这种情况下,PID=identifier 的进程的 niceness 值会被设置为<new priority>
b) 需要的时候中断一个进程的正常执行。这也就是通常所说的“杀死”进程。实质上,这意味着给进程发送一个信号使它恰当地结束运行并以有序的方式释放任何占用的资源。
按照下面的方式使用 kill 命令杀死进程:
# kill PID
另外,你也可以使用pkill结束指定用户(-u)、指定组(-G), 甚至有共同的父进程 ID (-P)的所有进程。这些选项后面可以使用数字或者名称表示的标识符。
# pkill [options] identifier
例如:
杀死组GID=1000的所有进程.
# pkill -G 1000
杀死PPID 是 4993的所有进程.
# pkill -P 4993
在运行pkill之前,先用pgrep测试结果、或者使用-l选项列出进程名称是一个很好的办法。它需要和pkill相同的参数、但是只会返回进程的 PID(而不会有其它 *** 作),而pkill会杀死进程。
# pgrep -l -u gacanepa
这个可以通过修改 vi /etc/security/limits.conf 文件来设定:# vi /etc/security/limits.conf
vpsee hard nproc 32
@student hard nproc 32
@faculty hard nproc 64
上面的配置文件意思是说限制 vpsee 这个用户只能 fork 32 个进程;然后限制 student 这个用户组的每个成员最多能
fork 32 个进程;限制 faculty 这个用户组的每个成员最多能 fork 64 个进程。不过要事先检查系统是否有
pam_limits.so 这个模块以及是否已经加载:
# ls /lib64/security/pam_limits.so
/lib64/security/pam_limits.so
# vi /etc/pam.d/login
session required pam_loginuid.so
如果自己是 Linux 普通用户,不是 root 用户不能修改 limits.conf 和重启系统的话,可以用 ulimit
来临时限制自己允许创建的进程数,ulimit 有 Hard 和 Soft 两种方法限制,用 Hard
的话可以减少最大可用的进程数,但是就不能重新增大这个限制了;用 Soft 的话可以自己自由增大和减小限制(ulimit,-H 和 -S
的详细说明可以参看 man ulimit)。不同的 Linux 版本对这个 ulimit -u 的默认值不同,在 CentOS
上默认情况下最大运行进程数是 8256,在 Fedora 上是
1024,所以这个要看不同的发行版本,不过这个无所谓,反正可以改,不过改成32后就不能再改成比32更大的了(比如64),只能再改成比32小
的,ulimit 不带 -H 和 -S 参数的时候同时设置 Hard 和 Soft:
$ ulimit -u
8256
$ ulimit -u 32
$ ulimit -u 64
-bash: ulimit: max user processes: cannot modify limit: Operation not permitted
$ 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) 8256
max locked memory (kbytes, -l) 32
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) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 32
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)