子进程物理内存空间公平预留
目录
实验环境
- Ubuntu 21.04
- python3
实验目的
- 实现客户端多子进程scapy发送数据包至同一个服务器
- 为客户端每个子进程预留同样的物理内存空间
成果
- 客户端
import multiprocessing
import psutil
import os
import resource
from scapy.all import *
def pkt_send(i):
# 设置rss
os.system("prlimit --pid %s --rss=10" %os.getpid())
# 子进程们单独使用同一优先级
os.system("sudo renice -5 -p %s "%(os.getpid()))
# 查询进程优先级
os.system("ps -l -p %s"%os.getpid())
print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid()))
# 发包
p=Ether()/IP(dst="192.168.0.3", src="192.168.0.2")/TCP(sport=5000,dport=80)/"Payload"
sendp(p,iface='ens33')
print("This is process",i)
if __name__ == '__main__':
process_list = []
for i in range(3):
p = multiprocessing.Process(target=pkt_send,args=(i,))
p.start()
process_list.append(p.pid)
for i in process_list:
# 打印rss设置
os.system("prlimit --pid %s --rss" %i)
- 服务器
from scapy.all import *
import pprint
def packet_callback(packet):
pprint.pprint(packet)
sniff(filter="ip src 192.168.0.2 and tcp and tcp port 80",prn=packet_callback, count=0)
分析
- 需完成内容包括三项:scapy收发包、创建多进程、预留公平的物理内存空间
- scapy收发包
# 客户端构造数据包并发送 p=Ether()/IP(dst="192.168.0.3", src="192.168.0.2")/TCP(sport=5000,dport=80)/"Payload" sendp(p,iface='ens33') # 服务器嗅探数据包 sniff(filter="ip src 192.168.0.2 and tcp and tcp port 80",prn=packet_callback, count=0) # filter设置过滤条件,prn后跟回调函数,函数中写明对数据包的处理方式
- 创建多进程(多进程的使用可回顾BGP裁决代码“进程new.py”)
p = multiprocessing.Process(target=pkt_send,args=(i,)) p.start() # 启动子进程
- 预留公平的物理内存空间
- 物理内存空间:RSS是实际分配给进程使用的物理内存 from~Linux进程中的RSS和VSZ
- 预留内存工具:prlimit from~linux命令之prlimit
# 设置和查看举例 # 设置rss os.system("prlimit --pid %s --rss=10" %os.getpid()) # 查看rss设置 os.system("prlimit --pid %s --rss" %i)
完成过程
- 完成过程中查询和尝试了一些工具 目前虽然没有用到,可能未来可以使用。
top指令
- from~linux上限制用户进程数、cpu占用率、内存使用率
- top输出中的%CPU这一列正是进程所占CPU时间占整个系统CPU的百分比,用于限制进程CPU占用率更加合理,同时%MEM一列还反应了进程占用内存的百分比,可以用于限制进程内存占用率。
CPU Usage Limiter for Linux(限制特定进程CPU使用率上限的工具)
- from~linux下限制CPU使用率的3种方法 的第三点
- 官方地址:http://cpulimit.sourceforge.net/
- python3中使用举例,将pid为xxx的进程的CPU限制在55%:
os.system("cpulimit --pid %s --limit 55" %os.getpid())
ps -f|grep详解
- from~ps -f|grep详解
- 链接中有解释打印出来的各参数的含义
python resource模块
- from~resource --- 资源使用信息¶
- getrlimit、setrlimit、prlimit
- 使用模板 from~如何限制python进程的内存使用量:
def limit_memory(maxsize):
soft, hard = resource.getrlimit(resource.RLIMIT_AS)
resource.setrlimit(resource.RLIMIT_AS, (maxsize, hard))
limit_memory(1024*1024*180) # 限制180M ,可申请内存,对应虚拟内存
- 未使用该方法的原因:一旦在子进程中运行了limit_memory函数就不会再执行接下来的命令行 即os.system指令了
cgroup
- from~如何通过 Cgroups 机制实现资源限制
- cgroups(全称:control groups)是 Linux 内核的一个功能,它可以实现限制进程或者进程组的资源(如 CPU、内存、磁盘 IO 等)。
- 未使用该方法的原因:
- 教程中提到的CPU子系统、memory子系统,没有相应的文件夹,即
/sys/fs/cgroup/
有,但是/sys/fs/cgroup/cpu
和/sys/fs/cgroup/memory
都没有,自己按照它所说的创建目录/sys/fs/cgroup/cpu/mydocker
和/sys/fs/cgroup/memory/mydocker
确实自动生成文件,但是与教程描述不同,需要用的tasks等文件都没有 - 教程提到用容器docker,实操发现总是permission deny 明明在sudo下,为节约时间便不再纠结
- 安装教程:[Ubuntu 20.04 安装 docker 详解](https://blog.csdn.net/u010381752/article/details/114086343)
- 报错解决方案:docker 安装完成后测试hello-world出现问题(Unable to find image 'hello-world:latest' locally),即
sudo systemctl restart docker
和sudo docker run hello-world
- 教程中提到的CPU子系统、memory子系统,没有相应的文件夹,即
Linux ——进程的虚拟地址空间,逻辑地址和物理地址,进程管理命令
- from~Linux ——进程的虚拟地址空间,逻辑地址和物理地址,进程管理命令
- 具体描述虚拟地址空间各部分内容 逻辑地址 物理地址
prlimit查询出来的soft和hard含义
- from~Soft limit vs Hard limit?
- 硬限制是软限制的上限。软限制是为会话或进程实际强制实施的。这允许管理员(或用户)将硬限制设置为他们希望允许的最大使用量
- 设置硬限制后,用户无法更改该限制。硬限制只能由 root 用户更改。但是,用户可以更改软限制,但不能超过硬限制,即它可以具有最小值0和最大值等于“硬限制”