博客cPen_web

知识点1 psutil介绍

#应用于系统监控
psutil介绍
	·process and system utilities				# 注:utilities工具  进程和系统工具
	·能够轻松的实现获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等)信息,主要应用于系统监控。
	·实现了同等命令命令行实现的功能:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等
	·跨平台:linux、windows、OS X、FreeBSD和Sun Solaris等
	·主要功能包含:CPU、磁盘、内存、网络、进程
# 注:ps		看进程
# 注:top	监控系统性能 (类似 任务管理器)
# 注:lsof	监控内存打开的文件数 list open file
# 注:netstat	网络连接状态
# 注:ifconfig	网卡信息
# 注:who	谁连接上来
# 注:df		看磁盘 (挂载/使用率)
# 注:磁盘文件 /dev
# 注:kill	进程 杀死或重新加载
# 注:free	看内存的
# 注:nice	看优先级
# 注:iostat	查看磁盘读写情况
# 注:iostat -x 1 查看其他
# 注:uptime		top的第1行输出
# 注:pidof	看进程pid号
# 注:taskset	看当前任务	对当前任务进行一些设置
# 注:pmap	看进程的内存

# 注:CPU的使用率超过50% 考虑扩容

示例1:top 监控系统性能 (类似 任务管理器)

[root@cPen_A ~]# top
#-------------------------------------------------------------------------------------------
top - 09:49:55 up  7:57,  8 users,  load average: 0.01, 0.02, 0.05	
# 平均负载	1分钟内的平均使用率	5分钟内	15分钟内
#-------------------------------------------------------------------------------------------
Tasks: 127 total,   1 running, 126 sleeping,   0 stopped,   0 zombie
# 注:任务	zombie僵尸进程状态
#-------------------------------------------------------------------------------------------
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# 注:看当前cpu当前状态	us用户空间	sy系统空间
# 注:id空闲状态(1s内99.8%属于空闲状态)、ni使用率(越高表示系统相当繁忙)
# 注:ni高时 考虑扩容 或者代码问题陷入循环
# 注:按1显示每1个CPU的使用率 (说的是它的逻辑CPU)
#-------------------------------------------------------------------------------------------
KiB Mem :  3861308 total,  3283352 free,   223188 used,   354768 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3398432 avail Mem 
# 注:Mem 内存
# 注:它的内存 swap 交换分区 在磁盘上面开辟1片空间出来供内存使用
# 注:buff/cache 缓存
#-------------------------------------------------------------------------------------------
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                               
  5258 root      20   0       0      0      0 S   0.3  0.0   0:00.12 kworker/1:0                                                           
     1 root      20   0  125524   4040   2600 S   0.0  0.1   0:02.30 systemd          
# 注:按占用多少CPU去排
#-------------------------------------------------------------------------------------------
# 注:物理CPU是实实在在镶嵌在主板上的
# 注:逻辑CPU 真正做事情的 (类似1个CPU上面有2个核/1个CPU上面有2组芯片)
#-------------------------------------------------------------------------------------------

示例2:运维做什么?保证服务7*24小时正常运行

1、监控到位
2、根据监控做处理/扩容
3、自动化 脚本

示例3:fdisk -l 查看磁盘分区

[root@cPen_A dev]# fdisk -l						# 注:查看磁盘分区
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes

[root@cPen_A ~]# cd /dev
[root@cPen_A dev]# ls sda
sda   sda1  sda2  
[root@cPen_A dev]# ls -al sda
brw-rw---- 1 root disk 8, 0 1124 19:32 sda		# 注:块设备文件
# 注:不能直接写入,需要把它挂到某个目录下,去目录的操作就是对磁盘分区的操作
[root@cPen_A dev]# df 
文件系统                   1K-块    已用     可用 已用% 挂载点
/dev/sda1                1038336  153512   884824   15% /boot	# 注:sda1盘 挂到/boot目录下
# 注:磁盘满了怎么解决?答:盘可以加 就扩容盘 ,盘不可以加 就扩容机器

示例4:iostat查看磁盘读写情况

#iostat -x 1	展示它的其他信息		重点关注util (读写状态)
[root@cPen_C yum.repos.d]# yum install sysstat
[root@cPen_A ~]# iostat -x 1		# 注:-x 展示他的其他信息 ,1 1s钟
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

示例5:uptime top的第1行输出

[root@cPen_A ~]# uptime
 10:49:23 up  8:56,  6 users,  load average: 0.00, 0.01, 0.05

示例6:dstat 监控cpu、磁盘、网络情况

[root@cPen_A ~]# yum install dstat
[root@cPen_A ~]# dstat		# 注:监控cpu、磁盘、网络
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  0   0 100   0   0   0|  10k 3373B|   0     0 |   0     0 |  62    81 

示例7:ethtool ens33 查看网卡状态、型号 比如怎样计算网卡流量

[root@cPen_C yum.repos.d]# ethtool ens33
	Speed: 1000Mb/s				# 注:网卡传播速度	千兆网卡	支撑1000M小b
	Link detected: yes				# 注:网卡是否连接
#注:1个字节8位

知识点2 安装

安装
	·源码安装:git clone https://github.com/giampaolo/psutil.git
cd psutil
python3 setup.py install
	·先安装相关库:yum install python3-devel,(用yum list |grep python|grep dev  找到包名), pip3 install psutil
	·导入使用模块: import psutil
>>> import psutil

示例

[root@cPen_B ~]# yum list |grep python |grep dev
python36-devel.x86_64                                3.6.8-2.module_el8.1.0+245+c39af44f              @AppStream
[root@cPen_B ~]# yum install python36-devel.x86_64
[root@cPen_B ~]# pip3 install psutil

#注:网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33

知识点3 psutil

1、cpu(linux命令:top)

	·psutil.cpu_count(,[logical]):默认返回逻辑CPU的个数,当设置logical的参数为False时,返回物理CPU的个数
	·psutil.cpu_percent(,[percpu],[interval]):返回CPU的利用率,percpu为True时显示所有物理核心的利用率,interval不为0,则阻塞时显示interval执行的时间内的平均利用率
	·psutil.cpu_times(,[percpu]):以命名元组(namedtuple)的形式返回cpu的时间花费,percpu=True表示获取每个CPU的时间花费。
		user:执行用户进程的时间
		system:执行内核进程时间
		idle:闲置的时间
		iowait:等待io操作的时间
		irp:硬中断时间
		softirq:软中断时间
	·psutil.cpu_times_percent(,[percpu]):功能和cpu_times大致相同,返回耗时比例
	·psutil.cpu_stats(): 以命名元组的形式返回CPU的统计信息,包括上下文切换,中断,软中断和系统调用次数
		ctx_switches:上下文切换次数
		interrupts:中断次数
		soft_interrupts:软中断次数
		syscalls:系统调用次数,linux上始终为0
	·psutil.cpu_freq(): 返回cpu频率

示例1:返回CPU个数

>>> import psutil
>>> psutil.cpu_count()					# 注:返回逻辑CPU个数
2
>>> psutil.cpu_count(logical=False)		# 注:返回物理CPU个数
2

示例2:CPU使用率 百分比利用率

>>> psutil.cpu_percent()                                                                                                        
0.1

示例3:cpu_times

>>> psutil.cpu_times()		# 注:花费的时间占用总时间的百分比
scputimes(user=105.27, nice=0.1, system=81.87, idle=69229.05, iowait=11.17, irq=0.0, softirq=5.25, steal=0.0, guest=0.0, guest_nice=0.0)

示例4:返回每个核的利用率

>>> psutil.cpu_percent(percpu = True)
[0.1, 0.1]

2、memory(linux命令:free)

	·virtual_memory():以命名元组的形式返回内存使用情况,单位为字节
		total:总物理内存
		available:可用内存,available ~free + buffers + cached
		percent:使用率: percent = (total - available) / total * 100
		used:使用的内存: used  =  total - free - buffers - cache	
# 注:一般不用used 因为buffer和cache是缓存的,对于程序而言是可以使用的,对于内存而言是被分出去的
# 注:buffer和cache的区别 buffer块设备的读写缓存区 、cache系统的缓存区
		free:完全没用使用内存
		active:最近被访问的内存
		inactive:长时间未被访问的内存
		buffers:缓存
		cached:缓存
		slab:内核数据结构缓存的内存
	·swap_memory:以命名元组的形式返回swap/memory使用情况,包含swap中页的换入和换出

示例1:virtual_memory

>>> psutil.virtual_memory()
svmem(total=3953979392, available=3447025664, percent=12.8, used=249577472, free=3045027840, active=350208000, inactive=329723904, buffers=2162688, cached=657211392, shared=12365824, slab=117297152)
#注:算内存的时候,用available 
#注:使用率 total - available

[root@cPen_A ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3770         231        2910          11         628        3294
Swap:          2047           0        2047

示例2:buffer、cache的缓存

  在Free命令中显示的buffer和cache,它们都是占用内存:
       buffer : 作为buffer cache的内存,是块设备的读写缓冲区,更靠近存储设备,或者直接就是disk的缓冲区。
       cache: 作为page cache的内存, 文件系统的cache,是memory的缓冲区
         如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小。

3、disk(linux命令:iostat,df)

	·psutil.disk_io_counters([perdisk]):以命名元组的形式返回磁盘io统计信息(汇总的),包括读、写的次数,读、写的字节数等
	·psutil.disk_partitions(:磁盘挂载分区信息
		device:分区
		mountpoint:挂载点
		fstype:文件系统格式(fat、ext4、 xfs)
		opts:挂载参数
	·disk_usage:磁盘使用情况,需要传入一个路径参数
		>>> psutil.disk_usage('/')
sdiskusage(total=250685575168, used=103938019328, free=134242258944, percent=43.6)
	·iostat   :  %util 数值越大越忙碌,到达了io瓶颈(安装包:yum install sysstat)

示例1:磁盘挂载分区信息 disk_partitions

>>> psutil.disk_partitions()                                                                                                                
[sdiskpart(device='/dev/mapper/centos-root', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]

示例2:磁盘使用情况 disk_usage

>>> psutil.disk_usage("/")					# 注:需要接挂载点
sdiskusage(total=18238930944, used=2300264448, free=15938666496, percent=12.6)

4、Network(linux命令:ifconfig、who、uptime,netstat)

	·psutil.net_io_counters([pernic]):以命名元组的形式返回当前系统中每块网卡的网络io统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。当pernic为True时,则列出所有网卡的统计信息。
		lo :本地回环地址(127.0.0.1)
	·psutil.net_connections([kind]):以列表的形式返回每个网络连接的详细信息(namedtuple)
		fd:文件描述符
		family:地址簇,ipv4(AF_INET),ipv6
		type:SOCK_STREAM(tcp)、udp
		laddr:本地ip地址
		raddr
		status
		pid
	·psutil.net_if_addrs():以字典的形式返回网卡的配置信息,包括IP地址和mac地址、子网掩码和广播地址。
	·psutil.net_if_stats():返回网卡的详细信息,包括是否启动、通信类型、传输速度与mtu
		mtu:最大传输单元
	·psutil.users():以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端
	·psutil.boot_time():以时间戳的形式返回系统的启动时间

示例1:psutil.users 以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端

>>> psutil.users()						# 注:w、who命令
[suser(name='root', terminal='tty1', host='', started=1606217600.0, pid=708), suser(name='root', terminal='pts/0', host='192.168.0.42', started=1606361216.0, pid=5921), suser(name='root', terminal='pts/2', host='192.168.0.42', started=1606361216.0, pid=5942), suser(name='root', terminal='pts/6', host='192.168.0.42', started=1606354816.0, pid=5239), suser(name='root', terminal='pts/7', host='192.168.0.42', started=1606357120.0, pid=5312)]

示例2:net_if_addrs

>>> psutil.net_if_addrs()			# 注:lo本地回环地址 127.0.0.1
{'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:00:00:00:00:00', netmask=None, broadcast=None, ptp=None)], 'ens33': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.0.21', netmask='255.255.255.0', broadcast='192.168.0.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::22d8:5740:d6d7:d1ff%ens33', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:0c:29:d1:80:fa', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}

5、进程管理(linux命令:ps、kill)

	·psutil.pids():以列表的形式返回当前正在运行的进程
	·psutil.pid_exists(1):判断给点定的pid是否存在
	·psutil.Process(1):对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号
	·psutil.process_iter():迭代当前正在运行的进程,返回的是每个进程的Process对象
		name:获取进程的名称
		cmdline:获取启动进程的命令行参数
		create_time:获取进程的创建时间
		uids:进程uid信息
		num_threads:开启的线程数
		exe:进程工作的绝对路径
		kill:发送SIGKILL信号结束进程

示例:process_iter 迭代当前正在运行的进程

>>> psutil.process_iter()                                                                                                                   
<generator object process_iter at 0x7f56eb912888>
>>> p = psutil.process_iter()
>>> next(p)
psutil.Process(pid=1, name='systemd', status='sleeping', started='01:52:52')

知识点4 mail模块

#mail模块
#1、邮件报警
#2、发送报表

#邮件协议
#1、smtp (simple mail transfer protocol) 简单邮件传输协议,主要用来发送文件  默认端口 25号
#2、pop3  主要用来接收邮件   默认端口 110    客户端的操作不会反馈到服务器端
#3、imap  主要用来接收邮件   默认端口 143    客户端的操作会反馈到服务器端

#注:……协议,就是规范
#注:通过协议实现的叫做服务

### 163邮箱获取授权码
# ICBHC………………………………
# RTACS………………………………
#Python收发邮件 smtplib ,poplib 和imaplab
#Python中涉及到发送邮件的两个模块:stmplib(发送模块) 和 email(用来构造邮件内容)
from smtplib import SMTP     # 导入smtplib模块的SMTP类
s = SMTP("smtp.163.com")    # 注:使用163邮箱去发送
s.login("cp1533431376@163.com","RTACS………………………………")    # 登录
tolist = ["fanfan343292019@163.com"]
msg = """\
From: cp1533431376@163.com
TO: fanfan343292019@163.com
Subject: cp

this is cp test
"""

s.sendmail("cp1533431376@163.com",tolist, msg)
# 2、email模块
#email 模块三个常用模块:text, image, mutilpart
from smtplib import SMTP
from email.mime.text import MIMEText

#第三方smtp服务设置
mail_host = "smtp.163.com"
mail_user = "cp1533431376@163.com"
mail_pass = "RTACS………………………………"

recv = "fanfan343292019@163.com"

#构造邮件内容
#正文内容、正文内容类型、正文内容编码
message = MIMEText("HELLO WORLD CP", "plain", "utf-8")  # plain是普通的文本

message["From"] = mail_user # 把对象像字典一样传参
message["To"] = recv
message["Subject"] = "cp-email"

s = SMTP("smtp.163.com")    # 注:使用163邮箱去发送
s.login("cp1533431376@163.com","RTACS………………………………")    # 登录
s.sendmail(mail_user,recv,message.as_string())    # 文件内容需要转换成字符型

示例:把内容识别成网页传送

#把内容识别成网页传送
#构造邮件内容
#正文内容、正文内容类型、正文内容编码
# message = MIMEText("HELLO WORLD CP", "plain", "utf-8")  # plain是普通的文本
html_msg = " <p>python邮件测试。。。</p><p><a href='https://www.baidu.com'>点击进入百度</a></p>"
message = MIMEText(html_msg,'html','utf-8')

message["From"] = mail_user # 把对象像字典一样传参
message["To"] = recv
message["Subject"] = "cp-email"

s = SMTP("smtp.163.com")    # 注:使用163邮箱去发送
s.login("cp1533431376@163.com","RTACS………………………………")    # 登录
s.sendmail(mail_user,recv,message.as_string())    # 文件内容转换成字符型

示例:怎样看服务的默认端口? /etc/services

[root@cPen_A ~]# cat /etc/services |grep smtp
smtp            25/tcp          mail
smtp            25/udp          mail
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐