# cpuburst-simulator **Repository Path**: anolis/cpuburst-simulator ## Basic Information - **Project Name**: cpuburst-simulator - **Description**: No description available - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-10-19 - **Last Updated**: 2022-10-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # cpuburst-simulator 依赖模块: * numpy 用于计算 * tqdm 用于进度条展示 ## 从给定分布进行模拟 `usage: python3 simu_from_distribution.py avg_cputime buffer cgroup_number` 三个参数分别代表平均cpu利用率、令牌桶相对quota的大小、整台服务器上运行的容器cgroup数量。 其中,avg\_cputime不应超过1,buffer设为-1视为无穷大的令牌桶,即对存储历史未用cpu资源的容量无上限。 例如,`python3 main.py 0.5 2 10` 表示: * 所有容器整体运行的cpu利用率为50%,或者可以说每个容器的cpu利用率相对它的quota是50%(在本例中,每个容器相对服务器总体占用的平均cpu利用率是1/10\*0.5=5%) * 每个容器为cpuburst功能开启的令牌桶大小(存储上限)为quota的200%倍。在本例中,每个容器的令牌桶大小为1/10\*2=20%,也就是说一个周期最多允许运行原本quota的10%额度加上存储上限的20%额度,即允许消耗最多30%的总体cpu资源 * 总共有10个容器,这意味着每个容器的quota限制为1/10=10% 另外,在代码中还有2处参数可配置,分别为模拟过程的总迭代周期itr(默认值1000000)和容器产生计算需求的分布distribution(默认为指数分布),可根据需求定制。 ## 从真实环境中采集数据进行模拟 ### Step 1: 数据采集 `usage: python3 sample.py cgroup_name sampling_times` 两个参数分别代表cgroup名字和采集次数,程序会先获取该cgroup的BWC周期(cpu.cfs\_period\_us),然后以该周期作为间隔采集cpuacct.usage接口获取数据。总运行时间取决于给定的采集次数和BWC周期,默认周期为100ms的情况下,总采集时间为sampling\_times\*0.1秒。 采集时请关闭cfs的BWC限流功能,且保证CPU资源充足,以确保采集到的数据是该cgroup真实产生的计算需求。 为了尽可能还原场景,体现真实性,我们建议有条件的话将采集次数设置得越大越好,例如设置为后续要进行的模拟迭代次数,尽管这可能会消耗比较长的时间。 采集完毕后将输出平均CPU利用率,可以将该值作为设置限流quota和总共配置容器数量m的参考。 数据将会存入data目录下的{cgroup\_name}\_data.npy文件。 ### Step 2: 模拟计算 `usage: python3 simu_from_data.py buffer cgroup_name:number,...` 两个参数分别代表令牌桶相对quota的大小和采集数据列表。第一项buffer参数已在上文说明。 采集数据列表以逗号将cgroup隔开,每项由(cgroup名称:准备配置同类cgroup数量)组成。例如 cg1:3,cg2:7 表示使用Step 1中采集好的名称为cg1和cg2的cgroup的数据,且实际业务场景中将打算配置3个cg1同类业务的容器和7个cg2同类业务的容器。 使用示例: `python3 simu_from_data.py 2 cg1:3,cg2:7` 将会自动读取data目录下的cg1\_data.npy和cg2\_data.npy,对于number>1的多个同类容器,将使用共同的采集列表数据,但是会均匀打散开始时间,使它们错开。具体逻辑可以在simulator.py模块中的GeneratorFromData类中查看和修改。 因此,一个完整的流程样例为: ``` python3 sample.py cg1 1000000 python3 sample.py cg2 1000000 python3 simu_from_data.py 2 cg1:3,cg2:7 ``` 其中采集工作可以并行执行。