使用python获取CPU和内存信息的思路与实现(linux系统)

本文介绍了如何在Linux系统中通过Python解析/proc目录下的CPUinfo和meminfo文件来获取CPU和内存详细信息。示例代码展示了如何使用OrderedDict组织数据,并通过cat命令查看相关文件内容。

linux里一切皆为文件,在linux/unix的根目录下,有个/proc目录,这个/proc 是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做“/proc”),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参数)。与其他文件系统不同,/proc 存在于内存而不是硬盘中。proc 文件系统提供的信息如下:

•进程信息:系统中的任何一个进程,在 proc 的子目录中都有一个同名的进程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些信息只有超级用户可见,例如进程根目录。每一个单独含有现有进程信息的进程有一些可用的专门链接,系统中的任何一个进程都有一个单独的自链接指向进程信息,其用处就是从进程中获取命令行信息。
•系统信息:如果需要了解整个系统信息中也可以从/proc/stat 中获得,其中包括 CPU 占用情况、磁盘空间、内存对换、中断等。
•CPU 信息:利用/proc/CPUinfo 文件可以获得中央处理器的当前准确信息。
•负载信息:/proc/loadavg 文件包含系统负载信息。
•系统内存信息:/proc/meminfo 文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等。

这样,你可以通过cat 命令查看相关信息:

processor : 0
vendor_id : GenuineIntel
cpu family : 6
model  : 58
model name : Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
stepping : 9
microcode : 0x15
cpu MHz  : 1200.000
cache size : 3072 KB
physical id : 0
siblings : 4
core id  : 0
cpu cores : 2
apicid  : 0

——————————————————————

MemTotal:        3593316 kB
MemFree:         2145916 kB
Buffers:           93372 kB
Cached:           684864 kB
SwapCached:            0 kB
Active:           706564 kB
Inactive:         554052 kB
Active(anon):     483996 kB
Inactive(anon):   178388 kB
Active(file):     222568 kB
Inactive(file):   375664 kB
————————————————————————————————

下面介绍如何通过python编程的方式获取需求的信息:
#! /usr/bin/env python
#Filename:CPU1.py

from __future__ import print_function
from collections import OrderedDict
import pprint

def CPUinfo():
    '''Return the info in /proc/cpuinfo
    as a dirctionary in the follow format:
    CPU_info['proc0']={...}
    CPU_info['proc1']={...}
    '''

    CPUinfo=OrderedDict()
    procinfo=OrderedDict()

    nprocs = 0
    with open('/proc/cpuinfo') as f:
        for line in f:
            if not line.strip():
                #end of one processor
                CPUinfo['proc%s' % nprocs]=procinfo
                nprocs = nprocs+1
                #Reset
                procinfo=OrderedDict()
            else:
                if len(line.split(':')) == 2:
                    procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip()
                else:
                    procinfo[line.split(':')[0].strip()] = ''
    return CPUinfo

if __name__ == '__main__':
    CPUinfo = CPUinfo()
    for processor in CPUinfo.keys():
        print('CPUinfo[{0}]={1}'.format(processor,CPUinfo[processor]['model name']))

运行如下:
CPUinfo[proc0]=Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
CPUinfo[proc1]=Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
CPUinfo[proc2]=Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
CPUinfo[proc3]=Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
获取内存信息:
#! /usr/bin/env python
#Filename:meminfo.py

from __future__ import print_function
from collections import OrderedDict

def meminfo():
    '''return the info of /proc/meminfo
    as a dictionary
    '''
    meminfo = OrderedDict()

    with open('/proc/meminfo') as f:
        for line in f:
            meminfo[line.split(':')[0]] = line.split(':')[1].strip()
    return meminfo


if __name__ == '__main__':
    meminfo = meminfo()

    print("Total memory:{0}".format(meminfo['MemTotal']))
    print("Free memory:{0}".format(meminfo['MemFree']))

结果如下:

Total memory:3593316 kB
Free memory:2113712 kB



<think>我们正在寻找一个用于服务器测试的Python脚本,该脚本需要测试USB设备、CPU内存。根据用户需求,我们需要编写一个脚本,或者提供思路来测试这三部分。测试USB:可以检测USB设备的连接状态、读写速度等。测试CPU:通常使用压力测试,例如计算素数或使用特定算法(如FFT)来让CPU满载,并监控温度或计算时间。测试内存:可以使用内存填充测试,例如分配大量内存并检查是否稳定。考虑到服务器测试,我们需要确保测试不会对系统造成永久性损害,并且能够提供测试报告。由于用户没有提供具体的测试细节,我们将设计一个简单的测试框架,包括:1.USB测试:列出USB设备,并进行简单的读写测试(需要挂载的USB存储设备)。2.CPU测试:运行一个计算密集型任务,记录时间。3.内存测试:分配一定量的内存,进行写入读取验证。注意:内存测试要小心,避免耗尽所有内存导致系统不稳定。我们可以测试一定量(比如1GB)的内存。另外,我们可能需要使用一些外部库来获取系统信息,例如`psutil`用于获取CPU内存信息,`pyusb`用于USB设备操作,但是`pyusb`可能需要权限且比较底层。对于简单的USB存储设备,我们可以使用标准库`os``shutil`进行文件读写测试。然而,用户要求的是一个脚本,因此我们将尽量使用标准库,或者如果必须使用第三方库,则给出安装说明。由于时间限制,我们设计一个简单的脚本,它可能不涵盖所有情况,但可以作为一个起点。步骤:1.CPU测试:使用一个循环计算一些数学运算(例如计算平方根)来占用CPU一段时间,并计算执行时间。2.内存测试:分配一个大列表,填充数据,然后验证数据,最后释放。3.USB测试:这比较复杂,因为USB设备种类多。我们假设测试的是USB存储设备。我们可以选择一个挂载点(比如`/mnt`或`/media`下的目录),然后进行文件读写删除测试。注意:如果没有USB存储设备挂载,我们可以跳过或者提示用户。我们将编写一个脚本,分别执行这三个测试,并输出结果。由于用户可能没有安装第三方库,我们尽量不使用。但是,对于CPU内存,我们可以使用`time``psutil`(但`psutil`不是标准库)。因此,为了简单,我们使用标准库。对于CPU,我们可以使用`time`模块计时,但计算压力测试我们可以用数学运算。对于内存,我们可以直接分配内存。对于USB,我们假设有一个挂载点,我们可以创建一个临时文件,写入内容,读取并验证,然后删除。具体步骤:1.CPU测试:-记录开始时间-进行大量计算(例如计算0到1000000的平方根)-记录结束时间,计算耗时2.内存测试:-尝试分配一定大小的内存(例如1GB),用一个列表来存储数据(注意:在Python中,一个整数大约28字节,所以1GB需要大约1000000000/28≈35714285个整数,但实际我们可以用更大的对象,比如字符串)-我们可以分配一个大约1GB的字节数组:`bytearray(b''*1024*1024*1024)`,但注意这可能会失败,所以我们可以分块测试,或者测试小一点(比如100MB)以避免内存不足。-写入数据后,读取验证,然后释放。3.USB测试:-选择一个挂载点(例如,我们可以让用户输入,或者自动检测,但自动检测比较复杂)。这里我们假设挂载点在`/mnt/usb`或`/media/usb`,或者我们可以提示用户输入。-在该挂载点创建一个临时文件,写入一定量的数据(比如100MB),然后读取验证,最后删除。由于我们不知道用户服务器的具体配置,我们将提供一些可配置的选项。我们编写脚本如下:</think>### Python服务器测试脚本(USB、CPU内存) 下面是一个用于服务器测试的Python脚本,涵盖USB设备检测、CPU压力测试内存稳定性测试。脚本使用标准库跨平台兼容设计: ```python import os import time import shutil import psutil import multiprocessing import platform def test_cpu(duration=10): """CPU压力测试:计算密集型任务""" print(f"🚀 开始CPU压力测试({duration}秒)...") end_time = time.time() + duration def cpu_load(): while time.time() < end_time: # 执行浮点运算消耗CPU [x**0.5 for x in range(10_000_000)] # 使用所有核心 processes = [] for _ in range(multiprocessing.cpu_count()): p = multiprocessing.Process(target=cpu_load) p.start() processes.append(p) for p in processes: p.join() # 验证CPU使用cpu_usage = psutil.cpu_percent(interval=1) status = "✅ 通过" if cpu_usage > 85 else f"⚠️ 异常(使用率{cpu_usage}%)" print(f"CPU测试完成: {status}\n") def test_memory(size_gb=1, duration=5): """内存稳定性测试:分配并保持内存""" print(f"💾 开始内存测试({size_gb}GB, {duration}秒)...") try: # 分配内存 (1GB = 1024^3 bytes) mem_block = bytearray(int(size_gb * 1024**3)) # 写入验证数据 pattern = b'TEST' * (len(mem_block) // 4) mem_block[:len(pattern)] = pattern # 保持分配状态 time.sleep(duration) # 验证数据完整性 if mem_block[:len(pattern)] == pattern: print("✅ 内存测试通过") else: print("❌ 内存数据损坏") except MemoryError: print(f"❌ 内存分配失败({size_gb}GB)") finally: del mem_block # 释放内存 print("") def test_usb(): """USB设备检测测试""" print("🔌 扫描USB设备...") usb_devices = [] # Windows系统检测 if platform.system() == 'Windows': import winreg try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Enum\USB") for i in range(winreg.QueryInfoKey(key)[0]): device_id = winreg.EnumKey(key, i) subkey = winreg.OpenKey(key, device_id) try: name = winreg.QueryValueEx(subkey, "FriendlyName")[0] usb_devices.append(name) except OSError: continue except Exception as e: print(f"⚠️ USB检测错误: {str(e)}") # Linux系统检测 elif platform.system() == 'Linux': try: usb_path = "/sys/bus/usb/devices/" for entry in os.listdir(usb_path): if entry.startswith('usb'): product_path = os.path.join(usb_path, entry, "product") if os.path.exists(product_path): with open(product_path, 'r') as f: usb_devices.append(f.read().strip()) except Exception as e: print(f"⚠️ USB检测错误: {str(e)}") # 输出结果 if usb_devices: print("✅ 检测到USB设备:") for i, dev in enumerate(usb_devices, 1): print(f" {i}. {dev}") else: print("⚠️ 未检测到USB设备") if __name__ == "__main__": print("\n" + "="*50) print("🛠️ 服务器硬件测试工具 (USB/CPU/内存)") print("="*50 + "\n") test_cpu() test_memory() test_usb() print("\n" + "="*50) print("✅ 所有测试完成!") print("="*50) ``` ### 使用说明 1. **依赖安装**: ```bash pip install psutil ``` 2. **运行测试**: ```bash python server_test.py ``` 3. **测试内容**: - **CPU测试**:满载运行10秒,验证高负载稳定性 - **内存测试**:分配1GB内存并验证数据完整性 - **USB测试**:扫描连接的USB设备 4. **自定义参数**: ```python test_cpu(duration=15) # 延长CPU测试时间 test_memory(size_gb=2) # 增加内存测试大小 ``` ### 测试原理说明 1. **CPU测试**:通过并行计算平方根操作使所有CPU核心满载,验证持续高负载下的稳定性[^1] 2. **内存测试**:分配指定大小的内存块并写入验证模式,检测内存错误分配能力 3. **USB检测**: - Windows:通过注册表`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB`获取设备信息 - Linux:通过`/sys/bus/usb/devices/`系统文件获取设备信息 > ⚠️ **注意事项**: > 1. 内存测试分配大内存时可能导致系统卡顿 > 2. CPU测试会使服务器满载,避免在生产环境运行 > 3. USB检测需要管理员/root权限[^2] > 4. Windows系统需安装[pywin32](https://pypi.org/project/pywin32/)扩展库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值