目录:
- linux常用命令之性能统计
- linux常用统计命令
- linux进程与线程
- Linux性能统计
1.linux常用命令之性能统计
为什么要学习性能统计?
性能统计是衡量系统性能的重要手段,通过对系统各项指标的监控和分析,可以及时发现系统瓶颈和问题,并采取相应的优化措施来提高系统的性能和稳定性。以下是一些为什么要学习性能统计的原因:
- 优化系统性能:性能统计可以帮助我们了解系统的性能瓶颈和问题,从而采取针对性的优化措施,提高系统的响应速度、吞吐量、并发用户数等指标。
- 确保系统稳定:性能统计可以及时发现系统中的异常情况,如系统崩溃、死锁、内存泄漏等,从而采取相应的措施来解决问题,确保系统的稳定性和可用性。
- 制定优化策略:通过对性能统计数据的分析,可以了解系统的性能瓶颈和问题,从而制定相应的优化策略,如增加硬件资源、调整算法、优化数据库等。
- 评估系统性能:性能统计可以评估系统的性能水平,从而了解系统的瓶颈和可优化空间,为后续的优化提供参考和依据。
- 监控系统运行状态:性能统计可以帮助我们及时发现系统中的异常情况,如系统崩溃、死锁、内存泄漏等,从而采取相应的措施来解决问题,确保系统的稳定性和可用性。
总之,学习性能统计对于系统开发和运维人员来说是非常重要的,可以帮助我们更好地了解系统的性能状况,及时发现和解决问题,提高系统的性能和稳定性。
性能统计知识:
- 系统级性能数据分析
- 进程级性能数据分析
常用性能指标:
- cpu 代表算法的高效性
- mem (内存)代表数据结构的使用合理性
- net io 等更多指标(net io 的不合理使用同样会在 cpu 和 mem 上体现出影响)
统计方法:
- 临时性分析 命令交互
- 系统性分析 prometheus grafana
cpu 信息 /proc/cpuinfo :
cat /proc/cpuinfo
cat /proc/cpuinfo
是一个 Linux 命令,用于显示 CPU 的信息。/proc/cpuinfo
是一个虚拟文件系统,它提供了有关 CPU 的详细信息,包括 CPU 型号、核心数量、缓存大小等。通过运行cat /proc/cpuinfo
命令,可以查看这些信息。这个命令对于理解系统硬件和性能问题非常有用。例如,如果你想了解你的系统有多少个 CPU 核心,以及每个核心的缓存大小,你可以运行cat /proc/cpuinfo
命令,并检查相关行。- 请注意,
cat /proc/cpuinfo
命令的输出是动态的,并且取决于系统的运行状态。在某些情况下,这个命令可能会因为系统正在运行而变得非常慢。
processor : 0 这是处理器的编号,表示是第一个处理器。
vendor_id : GenuineIntel 表示处理器的制造是 Intel。
cpu family : 6 表示处理器所属的 CPU 家族,这里是第 6 代。
model : 85 表示体的 CPU 型号,里是 Intel Xeon Platinum 8269CY。
model name : Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz 提供了 CPU 的详细型号和率信息。
stepping : 7 表示 CPU 的步进值,用于区分同一型号中不同版本。
microcode : 0x1 表示当前加载的微码版本。
cpu MHz : 2500.004 表示 CPU 的时钟率,以兆赫兹为单位。
cache size : 36608 KB 表示 CPU 缓存大小,这里是 36,608 KB。
physical id : 0 表示物理 CPU 的标识符,如果系统有多个物理 CPU,则有不同的标识符。
siblings : 2 表示在同一物理 CPU 上存在逻辑处理器(线)的数量。
core id : 0 表示逻辑处理器所的核心标识符。
cpu cores : 1 表示每个物理 CPU 上的核心数量。
apicid : 0 表示逻辑处理器的 APIC(高级可编程断控制器)标识符。
initial apicid : 0 表示初始 APIC 标识符。
fpu : yes 浮点运算单元(Floating Point Unit),表示 CPU 是否支持点运算。
fpu_exception : yes 指示 CPU 是否支浮点异常处理。
cpuid level : 22 CPUID 级别,用于标识 CPU 的功能和性。
wp : yes 写保护(Write Protect),表示 CPU 是否支持写保护功能。
flags : fpu vme de pse...... 标志位,列出了 CPU 支持各种特性和扩展指令集。
bogomips : 5000.00 BogoMIPS 是一个估算的 CPU 速度指标不是真实的时频率。
clflush size : 64 缓存行刷新大小,表示 CPU 缓存的刷新单位大小。
cache_alignment : 64 缓存对齐方式,表示 CPU 缓存的对齐要求。
address sizes : 46 bits physical, 48 bits virtual 地址大小,指示 CPU 支持的物理和拟地址位数。
power management: 电源管理,表示 CPU 是否支持节能和功管理。-----------------------------------------------------------------------------------------------------------------
processor : 1 处理器编号,表示当前处理器的序号。
..........
系统负载与进程 cpu 占用 top:
top
top - 17:52:05 up 250 days, 3:07, 1 user, load average: 0.21, 0.35, 0.40
Tasks: 86 total, 1 running, 85 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.7 us, 6.1 sy, 0.0 ni, 91.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1776404 total, 129680 free, 197624 used, 1449100 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1295884 avail Mem
up 250 days, 3:07
:这个系统已经运行了250天,3小时7分钟。1 user
:当前只有一个用户登录系统。load average
:这些数字表示过去1分钟、5分钟和15分钟的平均负载。负载是指系统中正在运行的进程数量。较小的数字表示系统负载较低,有更多的可用资源。Tasks
:当前运行的任务总数,包括正在运行的、等待睡眠的、停止的以及僵尸进程的数量。%Cpu(s)
:CPU使用情况的百分比。这些数字表示各个进程使用的CPU时间比例。KiB Mem
:系统内存的总容量。KiB Swap
:系统交换分区(swap)的总容量。buff/cache
:系统的缓冲区(buffer)和缓存区(cache)的容量。avail Mem
:系统中可用内存的容量。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID
:进程ID。USER
:运行该进程的用户名。PR
:进程的优先级,通常为0-9,数值越小表示优先级越高。NI
:进程的nice值,表示进程的优先级调整值,通常为-20到+19,数值越小表示优先级越高。VIRT
:进程的虚拟内存总量,包括代码、数据、栈和堆等,单位为KiB。RES
:进程的常驻内存量,单位为KiB,表示进程占用但未被分配给进程的内存。SHR
:进程共享内存量,单位为KiB,表示进程之间共享的内存。S
:进程的状态,包括'R'(运行)、'S'(睡眠)、'T'(停止)等。%CPU
:进程占用的CPU百分比。%MEM
:进程占用的内存百分比。TIME+
:进程消耗的CPU时间总和,单位为秒。COMMAND
:进程的名称和参数。
cpu 的关键指标:
- cpu 利用率 进程的 cpu 利用情况
- load average 系统负载情况
内存(MEM)占用统计:
- free
- ps
- top
total
:系统中总的内存容量,单位为KiB(千字节)。used
:系统中已使用的内存容量,单位为KiB。free
:系统中空闲的内存容量,单位为KiB。shared
:系统中被多个进程共享的内存容量,单位为KiB。buff/cache
:系统中被用作缓冲区或缓存区的内存容量,单位为KiB。available
:系统中空闲的、未被占用的内存容量,单位为KiB。
meminfo:/proc/meminfo 保存了更多的内存使用数据:
cat /proc/meminfo
MemTotal: 1776404 kB 这是系统中总的物理内存容量,单位为KB。
MemFree: 153156 kB 这是空闲的内存容量,包括所有未被分配给任何进程的内存。这个值通常很小,因为它包括了许多被操作系统保留的内存区域,如缓存、缓冲区等。
MemAvailable: 1316440 kB 这是空闲的、未被占用的内存容量,包括所有空闲的物理内存,不包括被操作系统保留的内存区域。这个值可以用来评估系统中可用的内存量。
Buffers: 142360 kB 这是被用作缓冲区的内存容量,通常用于磁盘I/O操作,以提高系统性能。
Cached: 1056508 kB 这是被用作缓存区的内存容量,通常用于存储当前使用的文件和数据,以提高读取效率。
SwapCached: 0 kB 这是被用作交换区的内存容量,通常用于临时存储当前使用的数据,当物理内存不足时,将部分内存交换到磁盘上。
Active: 779420 kB 这是当前正在使用的内存容量,包括所有正在运行的进程的内存映射。
Inactive: 526444 kB 这是当前未使用的内存容量,包括所有被进程占用的内存,但未被分配给任何进程的内存。
Active(anon): 107332 kB 这是当前正在使用的匿名内存容量,包括所有正在运行的进程的匿名内存映射。
Inactive(anon): 228 kB 这是当前未使用的匿名内存容量,包括所有被进程占用的匿名内存,但未被分配给任何进程的内存。
Active(file): 672088 kB 这是当前正在使用的文件映射内存容量,包括所有正在运行的进程的文件映射内存。
Inactive(file): 526216 kB 这是当前未使用的文件映射内存容量,包括所有被进程占用的文件映射内存,但未被分配给任何进程的内存。
Unevictable: 0 kB 不可替换的内存,通常指由于保护页面而无法被移出内存的页面。
Mlocked: 0 kB 被锁定(锁定)的内存,通常指被进程锁定而无法被其他进程使用的内存。
SwapTotal: 0 kB 总的交换空间大小,即物理内存不足时,将使用交换空间。
SwapFree: 0 kB 空闲的交换空间大小。
Dirty: 36 kB 脏的内存页面,即已经被修改但尚未写入磁盘的页面。
Writeback: 0 kB 正在写入磁盘的内存页面。
AnonPages: 107036 kB 匿名内存页面,通常指使用匿名内存映射的文件或共享内存段。
Mapped: 62256 kB 已映射的内存,通常指已将文件或设备映射到内存中的内存页面。
Shmem: 564 kB 共享内存,指通过共享内存区域进行通信的进程共享的内存。
Slab: 226892 kB 用于分配内核对象和数据的内存池。
SReclaimable: 152044 kB 可回收的内存,通常指可被回收以释放内存的页面。
SUnreclaim: 74848 kB 不可回收的内存,通常指无法被回收的页面。
KernelStack: 2880 kB 用于调度进程和执行系统调用栈的内存。
PageTables: 4768 kB 用于在虚拟地址和物理地址之间进行转换的内存。
NFS_Unstable: 0 kB 不可用的不稳定内存,通常指通过NFS(网络文件系统)访问的文件系统使用的内存。
Bounce: 0 kB 用于缓存预取的内存页面,通常指预取的页面正在被交换出去。
WritebackTmp: 0 kB 该项表示当前正在写入缓冲区中的数据的大小。这些数据可能尚未被刷新到磁盘上,因此它们暂时存储在内存中。
CommitLimit: 888200 kB 该项表示系统中物理内存的总量,包括共享内存(SHMEM)和缓存内存(Buffer and Cache Memory)。
Committed_AS: 690196 kB 该项表示已经被分配的内存量,包括已经映射到进程虚拟地址空间的内存和已经被写回磁盘的内存。
VmallocTotal: 34359738367 kB 该项表示Vmalloc(malloc的扩展版本)可用内存的总大小。
VmallocUsed: 10840 kB 该项表示已经使用了Vmalloc的内存量。
VmallocChunk: 34359719676 kB 该项表示Vmalloc分配的内存块的大小。
HardwareCorrupted: 0 kB 该项表示硬件损坏的内存量。
AnonHugePages: 32768 kB 该项表示匿名巨大内存页的大小。这些页用于支持大型数据结构,如大型数组或大型缓冲区。
CmaTotal: 0 kB 该项表示管理内存(CMA)的总大小。
CmaFree: 0 kB 该项表示可用于分配的CMA内存量。
HugePages_Total: 0 该项表示系统中总共有多少个巨大内存页。
HugePages_Free: 0 该项表示系统中当前空闲的巨大内存页数量。
HugePages_Rsvd: 0 该项表示已经被保留的巨大内存页数量。
HugePages_Surp: 0 该项表示在需要时可以用来填充巨大内存页的临时内存量。
Hugepagesize: 2048 kB 该项表示巨大内存页的大小。
DirectMap4k: 53944 kB 该项表示直接映射到物理内存中的4KB内存页的数量。
DirectMap2M: 1937408 kB 该项表示直接映射到物理内存中的2MB内存页的数量。
DirectMap1G: 0 kB 该项表示直接映射到物理内存中的1GB内存页的数量。
进程级别的内存分析:
ps -e -o uid,pid,ppid,pcpu,pmem,rss,vsz,comm --sort -%mem | head -10
ps -e -o uid,pid,ppid,pcpu,pmem,rss,vsz,comm
: 这个命令用于显示系统中所有进程的详细信息,包括进程ID(pid)、进程所属用户ID(uid)、父进程ID(ppid)、CPU使用率(pcpu)、内存使用率(pmem)、内存占用(rss和vsz)、以及进程的名称(comm)。--sort=-%mem
: 这个选项用于按照进程的内存使用率进行排序,其中%mem是进程的内存使用率的百分比。| head -10
: 这个选项用于显示前10个进程的信息,使用管道符将前面的命令的输出传递给head命令进行处理。
top 命令:(同上,既能分析cpu也能分析内存)
网络连接(Net)统计:
查看网络连接:
netstat -tnp | head -10
netstat -tnp | head -10
这个命令用于显示网络状态信息,并且按每个进程的网络内存使用量排序。具体来说,它的工作方式如下:
netstat -tnp
:执行netstat
命令,并显示网络状态信息。-t
选项表示显示 TCP 连接状态信息,-n
选项表示以数字形式显示地址和端口号,-p
选项表示显示正在监听的网络服务进程的 PID(进程 ID)。| head -10
:将输出重定向到管道,然后使用head
命令将前 10 条结果输出。因此,执行该命令将显示当前正在监听的网络服务进程的 PID、地址、端口号、CPU 占用率、内存占用情况以及进程的名称。这些信息按每个进程的网络内存使用量从高到低排序。
Proto
:表示网络协议,比如 TCP、UDP 等。Recv-Q
和Send-Q
:分别表示接收队列和发送队列的大小。队列的大小表示等待处理的连接请求或数据包的数量。Local Address
和Foreign Address
:分别表示本地地址和远程地址,包括 IP 地址、端口号等。State
:表示连接的状态,比如ESTABLISHED 表示连接已经建立,等待发送或接收数据,TIME_WAIT 表示连接已经关闭,但数据包还在网络中。PID/Program name
:表示进程的 PID 和程序名称。
网络状态:
- ESTABLISHED - 已建立连接:该套接字已建立连接。
- SYN_SENT - 正在尝试建立连接:该套接字正在积极尝试建立连接。
- SYN_RECV - 已收到连接请求:从网络中接收到连接请求。
- FIN_WAIT1 - 已关闭套接字,正在关闭连接:套接字已关闭,并且连接正在关闭中。
- FIN_WAIT2 - 连接已关闭,套接字等待远程端关闭:连接已关闭,套接字正在等待远程端关闭。
- TIME_WAIT - 主动关闭:套接字在关闭后等待处理仍在网络中的数据包。
- CLOSE - 未使用的套接字:套接字未被使用。
- CLOSE_WAIT - 被动关闭:远程端已关闭,等待套接字关闭。
- LISTEN - 正在监听:套接字正在监听传入连接。
数据统计
netstat -tn | awk 'NR>2{print $NF}'| sort | uniq -c | sort -nr
2.linux常用统计命令
排序:sort:
- sort常用参数
- -b:忽略开头的空白字符
- -f∶将小写字母看作为大写字母
- -h:根据存储容量排序(KB、MB、GB)
- -n︰按数字排序
- -o︰把结果写入文件
- -r︰以相反的顺序来排序
- -t:指定分隔符。默认为空格
- -V:按照数字版本排序
- -k:指定排序的关键字,与t参数配合使用
- sort 命令,Linux sort 命令详解:对文本文件中所有行进行排序。 - Linux 命令搜索引擎
去除重复:uniq:
uniq常用参数(只检查上下行是否重复)。
- -c:统计重复出现的次数
- -d:所有邻近的重复行只被打印一次。重复次数要>=2次
- -D:所有邻近的重复行将全部打印
- -f:跳过对前n个列的比较
- -s:跳过对前n个字符的比较
- -w︰只对每行前n个字符进行比较
字符统计:wc
- -c:统计字节数: chars
- -l:统计行数
- -w:统计单词数
- -L:打印最长行的长度
3.linux进程与线程
进程::
- 进程是操作系统中进行资源分配的最基本单位,它是程序的执行过程,在操作系统中,进程可以被看作是一个独立的运行单位。每个进程都有自己独立的内存空间和执行上下文,可以在自己的虚拟地址空间中运行,与其他进程相互独立。进程可以包含多个线程,线程是进程中的一个执行单元,可以共享进程的内存空间和执行上下文,线程之间相互协作,完成进程的任务。
- 进程的创建、撤销和调度由操作系统负责管理,进程的创建通常是由程序调用操作系统提供的进程管理函数或接口来完成的。在程序执行之前,操作系统会为该程序分配内存空间和系统资源,并创建一个新进程。程序在运行过程中也可以创建新进程来处理不同的任务。
- 进程是操作系统多任务处理的基础,操作系统可以将系统资源分配给不同的进程,并按照一定的调度策略来执行这些进程,从而实现并发执行。进程之间相互独立,互不干扰,每个进程都有自己的内存空间和执行上下文,操作系统可以通过进程间通信来实现不同进程之间的协作。
线程:
- 线程是进程中的执行单元,一个进程可以包含多个线程,每个线程共享进程的内存空间和执行上下文,但每个线程都有自己独立的执行栈和寄存器状态。线程之间相互协作,完成进程的任务。
- 线程的创建、撤销和调度由操作系统负责管理,线程的创建通常是由进程中的某个线程调用操作系统提供的线程管理函数或接口来完成的。在进程中,线程的切换比进程的切换代价更小,因为线程之间的内存空间是共享的,操作系统可以直接在共享内存空间上进行读写操作,而不需要进行额外的操作。
- 线程的执行依赖于操作系统的调度策略,不同的操作系统有不同的调度策略,操作系统可以将系统资源分配给不同的线程,并按照一定的调度策略来执行这些线程,从而实现并发执行。线程之间相互协作,可以共享进程的资源,实现任务的并行处理,提高程序的执行效率。
进程的生命周期:
- created
sleep 100
./demo.py
- ready
- running
- waiting
- terminated
kill
killall
import multiprocessing
import os
import sys
import threading
from time import sleep
def thread_demo(index):
while True:
print(f"thread_demo {index} pid={os.getpid()} thread_name={threading.current_thread().name}")
sleep(1)
def process_demo(index):
while True:
print(f"process_demo {index} pid={os.getpid()} thread_name={threading.current_thread().name}")
sleep(1)
def multi_thread(count):
for index in range(count):
thread = threading.Thread(target=thread_demo, args=[index])
thread.start()
sleep(1)
def multi_process(count):
for index in range(count):
process = multiprocessing.Process(target=process_demo, args=(index,))
process.start()
sleep(1)
if __name__ == '__main__':
process_count = int(sys.argv[1])
thread_count = int(sys.argv[2])
multi_process(process_count)
multi_thread(thread_count)
input()
这个命令用于查找当前用户下正在运行的所有包含"demo.py"字符串的进程,并输出这些进程的详细信息如下:
通过这个指令,可以详细了解正在运行的进程的信息,包括进程的 CPU 使用率、内存占用等性能指标,以及进程打开的文件句柄数和文件数等资源使用情况。这对于系统管理员和开发人员来说非常有用,可以帮助他们更好地管理和优化系统资源如下:
使用这个命令可以显示进程的详细信息,包括进程的ID、名称、状态、线程数、父进程ID、命令行参数等信息,以及进程之间的父子关系。这些信息对于诊断和分析系统性能和问题非常有用如下:
常用进程管理命令:
- ps 进程列表快照
- top 交互式进程观测
- kill killall 结束进程
- fg 进程切换到前台
- bg 进程切换到后台
- ctrl z 挂起进程
ps 命令:
- unix 风格参数
ps -ef
- bsd 风格参数
ps aux
- gnu 风格参数
ps --pid pidlist
进程状态:
- D 不可中断的睡眠状态(通常是在等待IO)
- R 运行状态或可运行状态(在运行队列中)
- S 可中断的睡眠状态(等待某个事件完成)
- T 被作业控制信号停止
- t 在跟踪过程中被调试器停止
- W 页面交换(自2.6.xx内核以后不再是有效的状态)
- X 死亡状态(不应该看到)
- Z 僵死状态(进程已经结束,但它的父进程还未回收它)
这个命令用于查找当前用户下正在运行的所有与python相关的进程,并显示这些进程的详细信息,包括进程的CPU使用率、内存占用等性能指标,以及进程的状态和命令行参数等信息。
4.Linux性能统计
查询 Linux 系统负载与进程:
top
ps aux
查询 Linux 系统内存使用数据并保存到data.txt中:
cat /proc/meminfo > data.txt
统计内存数据文件的字节数:
wc -c data.txt
对内存数据文件的每一行按 ASCII 码值降序排列并去重:
sort -r data.txt | uniq > sorted_and_unique.txt
查询 Linux 系统进程列表快照:
ps -ef