write in Python script demonstrating how the misleading CPU utilization can be generated

需求

思路

  1. 首先由于GIL锁的存在,python并不存在真正意义上的多线程,所以可以用multiprocessing的affinity 方法指定在某一个逻辑处理器上运行
  2. 接下来要确定逻辑处理器和物理处理器的对应关系 (/proc/cpuinfo)
  3. 然后就可以Python模拟了
  4. 但是还存在一些观测上的问题,比如输出日志本身会导致磁盘的IO,top命令和其他进程可能在这个core上运行从而造成影响,虚拟机(WSL)外部的进程影响等等,为了解决这个问题,需要隔离"OS noise",这个可能比较麻烦,不止在软件的实现上,也在硬件的需求上

指定逻辑CPU运行

import multiprocessing


def worker():
    print(f"Running on processor: {multiprocessing.current_process().name}")


def run(n: int):
    
    # 创建一个进程对象
    process = multiprocessing.Process(target=worker)

    # 指定进程在逻辑处理器n上运行
    process.affinity = [n]

    # 启动进程
    process.start()
    process.join()

# 获取系统的逻辑处理器数量     
num_processors = multiprocessing.cpu_count()
for i in range(num_processors):
    run(i)

确定逻辑处理器和物理处理器的对应关系

write in Python script demonstrating how the misleading CPU utilization can be generated_第1张图片

write in Python script demonstrating how the misleading CPU utilization can be generated_第2张图片
逻辑CPU是按序排列的,一个core对应两个逻辑CPU

查看当前各个逻辑CPU的利用率

top然后按1

write in Python script demonstrating how the misleading CPU utilization can be generated_第3张图片
似乎除了前四个core,都比较空

采集数据

要记录一段时间的 CPU 利用率和各个核心的 CPU 利用率,你可以使用 top 命令结合输出重定向和延时命令。

下面是一个示例的命令:

top -b -d 1 -n <duration> | grep -E "^(%Cpu|CPU:)" >> cpu_usage.log

其中, 是你想要记录的时间段,单位为秒。这个命令会每秒钟采样一次 CPU 利用率,并将结果输出到 cpu_usage.log 文件中。

解释一下命令中的参数:

-b:以批处理模式运行 top 命令,不在终端上实时显示结果。
-d 1:设置采样的延时为 1 秒,即每秒钟记录一次 CPU 利用率。
-n :设置采样的次数,根据 参数来决定记录的时间长度。
grep -E “^(%Cpu|CPU:)”:筛选出 %Cpu 和 CPU: 开头的行,即 CPU 利用率相关的行。


制造负载

taskset -c 8,9,10  /opt/bisheng-jdk1.8.0_372/bin/java -jar ./SPECjvm2008.jar compress

SPECjvm2008会占用大部分算力,指定core运行从而收集数据

你可能感兴趣的:(cpu,perf,性能,性能优化)