1.思考步骤
- 查看资源使用的详细情况
- 根据使用情况决定分配策略
- 修改资源分配
2.如何查看运行中的使用的详细情况?
- 进程跟踪:top
- 查看打开的文件:lsof
lsof的输出、包含以下字段。 COMMAND:拥有文件描述符的的进程对应的命令名。 PIM:PID。 USER:运行进程的用户。 FD:该列包含两种元素。本例中FD列显示文件的作用。该列还能够显示打开文件的描述 符。文件描述符是一个数字,进程通过它使用系统库和内核来进行文件标识和操作。 TYPE:文件类型(如常规文件、目录、套接字等)。 DEVICE:包含该文件的设备的主要代码和次要代码。 SIZE:文件大小。 NODE:文件的索引节点编号。 NAME:文件名。
如果出现上图所示,这是因为没有权限,需要使用sudo,
运行lsof有以下两种基本方式。
输出完整的结果,然后将输出结果通过管道用命令less显示,然后在其中搜索你想要的内 容。由于输出结果信息量很大,该方法可能会花点时间。
使用命令行选项来过滤lsof的输出结果。
- 显示一个文件夹下面的文件使用情况,lsof /usr
- 使用pid来精确查找,lsof -p pid
3.如何查看中断的使用的详细情况?
上面都是在查看运行中的进程,如果进程发生错误退出了你就啥也看不到了,为此,要使用跟踪程序执行和系统调用
strace(系统调用跟踪)查看用户空间请求内存执行的经过授权的操作,诸如打开文件、读取数 据等等
示例:strace cat /dev/null
ltrace(
跟踪对共享库的调用)查看
程序在运行时与各种共享库之间的交互情况
ltrace [选项] 程序 [参数...]
示例:ltrace ./my_program
4.如何查看系统线程使用情况?
ps m
线程有一个特殊的标识符tid来表示它自己,想要查看的话需要使用ps m -o pid,tid,command
注意如果pid和tid相同,就意味着这是一个单线程
5.测量CPU时间
监控进程,可以使用top命令加-p选项
示例:top -p pid1 [-p pid2 ...]
而使用time命令则可以查看整个执行过程中占用的CPU时间
示例:/usr/bin/time ls 则可以查看ls执行需要的时间
显示的消息包括:
user:用户时间,指CPU用来运行程序代码的时间,以秒为单位。在现在的处理器中,命 令的运行速度很快,有些不超过一秒,time命令会将它们四舍五入为0。
system:系统时间,指内核用来执行进程任务的时间(例如读取文件和目录)。
elapsed:消耗时间,指进程从开始到结束所用的全部时间,包括CPU执行其他任务的时 间。这个数字在检测性能方面不是很有帮助,不过将消耗时间减去用户时间和系统时间 所剩余的时间,能够让你得知进程等待系统资源所消耗的时间。
6.优化手段1--调整进程优先级
我们可以对更改内核对进程的调度方式,从而增加或减少安排给进程的CPU时间。
内核按照每个 进程的调度优先级来运行进程,这些优先级用20和20之间的数字表示。有些古怪的是,20是最高的优先级。越大表示优先级越小
top命令中显示的PR便是表示优先级
PR字段旁边是NI(意思是优先值)字段,显示有关内核进程调度的少许信息,如果你想干预 内核的进程调度,这个信息会对你有用。内核使用NI值来决定进程下一次在什么时间运行。 NI默认值是0。例如,你在后台运行一个计算量很大的进程,且不希望它影响到前台的交互, 想让它在其他进程空闲的时候再运行,就可以使用renice命令将NI设置为20(pid是你要设置的 进程的ID)
示例: renice 20 pid
7.优化手段2--平均负载
平均负载(load average)是准备就绪待执行的进程的平均数。 也就是某一时刻可以使用CPU的进程数的一个估计值。
示例:uptime
19:52:11 up 6 days, 11:13, 4 users, load average: 1.09, 1.04, 1.06
分别代表过去1分钟、5分钟和15分钟的平均负载值。
-
值越低,表示系统越空闲。
-
值越高,表示系统负载越高。
-
如果值接近或超过CPU核心数(例如,单核CPU接近1,多核CPU接近核心数),系统可能变得忙碌。
#小技巧:你可以使用lscpu来查看你当前cpu多少核
8.查看系统错误
轻微内存页面错误(页面存在但是MMU无法找到时)、严重内存页面错误(页面不存在)
示例:/usr/bin/time cal > /dev/null 查看发生错误
示例:ps -o pid,min_flt,maj_flt pid
MINFL和MAJFL列显示轻微和严重内存页面错误数目
9.使用vmstat监控CPU和内存性能
示例:vmstat 刷新的秒数
当你运行这个命令时,你会看到一个每刷新秒数更新一次的表格,其中包括以下信息:
-
procs(进程):
-
r
:运行队列中的进程数(等待运行的进程数)。 -
b
:不可中断睡眠的进程数(等待I/O的进程数)。
-
-
memory(内存):
-
swpd
:虚拟内存已使用的大小(单位:KB)。 -
free
:空闲内存大小(单位:KB)。 -
buff
:用作缓冲区的内存大小(单位:KB)。 -
cache
:用作缓存的内存大小(单位:KB)。
-
-
swap(交换区):
-
si
:从交换区读入内存的交换页数量(单位:KB/秒)。 -
so
:写入交换区的交换页数量(单位:KB/秒)。
-
-
io(输入/输出):
-
bi
:从块设备读入的块数(单位:块/秒)。 -
bo
:写入块设备的块数(单位:块/秒)。
-
-
system(系统):
-
in
:每秒的中断数,包括时钟中断。 -
cs
:每秒的上下文切换数。
-
-
cpu(CPU):
-
us
:用户进程消耗的CPU时间百分比。 -
sy
:系统进程消耗的CPU时间百分比。 -
id
:空闲CPU时间百分比。 -
wa
:等待I/O完成所消耗的CPU时间百分比。 -
st:
被其他虚拟机窃取的CPU时间百分比(仅用于虚拟化环境)。
-
10.I/O监控
示例:iostat
示例:iotop
示例:pidstat -p 1329 1 查看过去某一时间段pid的资源使用情况
11.分配策略
1. CPU分配策略
-
CPU亲和性:将特定的进程绑定到特定的CPU核心上,以减少进程在多个核心之间切换的开销。
taskset -c 0-3 my_program # 将my_program绑定到CPU 0-3核心上运行
-
进程优先级:使用
nice
命令调整进程的调度优先级。nice -n 10 my_program # 启动my_program并将其优先级设置为10(默认优先级为0)
使用
renice
命令可以在进程运行时调整其优先级。renice 5 -p 1234 # 将PID为1234的进程优先级设置为5
2. 内存分配策略
-
内存限制:使用cgroups(控制组)限制进程或进程组的内存使用。
cgcreate -g memory:/mygroup # 创建一个名为mygroup的控制组 echo 1G > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes # 设置内存限制为1GB cgexec -g memory:mygroup my_program # 在mygroup控制组中运行my_program
3. I/O分配策略
-
I/O调度器:选择合适的I/O调度器以优化磁盘访问性能。常见的I/O调度器包括
cfq
、deadline
和noop
。echo deadline > /sys/block/sda/queue/scheduler # 将sda设备的I/O调度器设置为deadline
4. 网络带宽分配策略
-
流量控制:使用
tc
命令设置流量控制规则,以限制特定进程或网络接口的带宽使用。tc qdisc add dev eth0 root handle 1: htb default 11 tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit
5. 磁盘空间分配策略
-
磁盘配额:使用
quota
命令设置用户或组的磁盘配额,以限制他们在文件系统上使用的磁盘空间