子进程物理内存空间公平预留

实验环境

  • 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
    os.system("prlimit --pid %s --rss=10" %os.getpid())
    # 查看rss设置
    os.system("prlimit --pid %s --rss" %i)
    

完成过程

  • 完成过程中查询和尝试了一些工具 目前虽然没有用到,可能未来可以使用。

top指令

CPU Usage Limiter for Linux(限制特定进程CPU使用率上限的工具)

ps -f|grep详解

python resource模块

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

Linux ——进程的虚拟地址空间,逻辑地址和物理地址,进程管理命令

prlimit查询出来的soft和hard含义

  • from~Soft limit vs Hard limit?
  • 硬限制是软限制的上限。软限制是为会话或进程实际强制实施的。这允许管理员(或用户)将硬限制设置为他们希望允许的最大使用量
  • 设置硬限制后,用户无法更改该限制。硬限制只能由 root 用户更改。但是,用户可以更改软限制,但不能超过硬限制,即它可以具有最小值0和最大值等于“硬限制”

posted on 2022-07-19 22:52  2002ljy  阅读(67)  评论(0编辑  收藏  举报

导航

Live2D