从语言隔阂到沉浸体验:FF14国际服中文汉化的技术解密之旅
2026/6/4 16:54:46
nproc是 Linux 中用于显示当前进程可用的处理器(CPU)数量的命令。它从/proc/cpuinfo或sysconf系统调用获取 CPU 核心数信息。
nproc[选项]# 显示当前进程可用的 CPU 核心数nproc# 显示系统安装的总 CPU 核心数(不考虑 affinity)nproc--all# 忽略指定数量的 CPU 核心nproc--ignore=2# 组合使用nproc--all--ignore=2$ nproc8$ nproc--all16$ nproc--ignore=44| 选项 | 说明 |
|---|---|
--all | 显示系统安装的总 CPU 核心数,不考虑 affinity 限制 |
--ignore=N | 忽略 N 个 CPU 核心(用于资源限制场景) |
--help | 显示帮助信息 |
--version | 显示版本信息 |
# 1. 使用 nproc(推荐)nproc# 可用核心数nproc--all# 总核心数# 2. 使用 lscpu(详细信息)lscpu|grep-E"^(CPU\(s\)|Core\(s\)|Socket\(s\))"lscpu|grep"CPU(s):"|awk'{print $2}'# 3. 查看 /proc/cpuinfogrep-c"processor"/proc/cpuinfo# 逻辑核心数grep"physical id"/proc/cpuinfo|sort-u|wc-l# 物理 CPU 数grep"cpu cores"/proc/cpuinfo|head-1|awk'{print $4}'# 每 CPU 核心数# 4. 使用 getconfgetconf _NPROCESSORS_ONLN# 在线 CPU 数getconf _NPROCESSORS_CONF# 配置的 CPU 数# 5. 使用 top/htoptop-n1|grep"Cpu(s)"# 显示 CPU 信息# 或直接运行 htop# 6. 使用 nproc 的替代命令cat/sys/devices/system/cpu/online# 在线 CPU 范围cat/sys/devices/system/cpu/present# 存在的 CPU 范围| 命令 | 输出内容 | 是否考虑 affinity | 速度 | 推荐度 |
|---|---|---|---|---|
nproc | 可用 CPU 核心数 | ✅ | ⚡ 最快 | ⭐⭐⭐⭐⭐ |
nproc --all | 总 CPU 核心数 | ❌ | ⚡ 快 | ⭐⭐⭐⭐⭐ |
lscpu | 详细 CPU 架构信息 | ❌ | ⚡ 快 | ⭐⭐⭐⭐ |
/proc/cpuinfo | 原始 CPU 信息 | ❌ | ⚡ 快 | ⭐⭐⭐ |
getconf | 系统配置值 | 部分 | ⚡ 快 | ⭐⭐⭐⭐ |
#!/bin/bash# 根据 CPU 核心数自动优化并行任务# 获取 CPU 核心数TOTAL_CORES=$(nproc--all)AVAILABLE_CORES=$(nproc)echo"系统信息:"echo"=========="echo"总 CPU 核心数:$TOTAL_CORES"echo"可用 CPU 核心数:$AVAILABLE_CORES"# 根据可用核心数设置并行任务数if[[$AVAILABLE_CORES-ge8]];thenPARALLEL_JOBS=$((AVAILABLE_CORES-2))# 保留 2 个核心echo"检测到高性能系统,设置并行任务数:$PARALLEL_JOBS"elif[[$AVAILABLE_CORES-ge4]];thenPARALLEL_JOBS=$((AVAILABLE_CORES-1))# 保留 1 个核心echo"检测到中等性能系统,设置并行任务数:$PARALLEL_JOBS"elsePARALLEL_JOBS=1echo"检测到低性能系统,使用单线程"fi# 使用示例:编译软件echo"开始编译,使用$PARALLEL_JOBS个并行任务..."make-j$PARALLEL_JOBS# 或处理文件find.-name"*.log"-typef|xargs-P$PARALLEL_JOBS-I{}gzip{}#!/bin/bash# CPU 资源监控脚本LOG_FILE="/var/log/cpu_monitor.log"CHECK_INTERVAL=5# 检查间隔(秒)THRESHOLD=80# CPU 使用率阈值(%)monitor_cpu(){localtotal_cores=$(nproc--all)localavailable_cores=$(nproc)localcpu_usage=$(top-bn1|grep"Cpu(s)"|awk'{print $2}'|cut-d'%'-f1)# 计算每个核心的平均使用率localper_core_usage=$(echo"scale=2;$cpu_usage/$total_cores"|bc)echo"=== CPU 监控报告 ==="echo"时间:$(date'+%Y-%m-%d %H:%M:%S')"echo"总核心数:$total_cores"echo"可用核心数:$available_cores"echo"总 CPU 使用率:${cpu_usage}%"echo"每核心平均使用率:${per_core_usage}%"# 检查是否超过阈值if(($(echo "$cpu_usage>$THRESHOLD"|bc-l)));thenecho"⚠️ 警告: CPU 使用率超过阈值 (${THRESHOLD}%)"# 记录高负载进程echo"高负载进程 Top 5:"psaux--sort=-%cpu|head-6|awk'NR>1 {printf "%-10s %-10s %-10s\n", $2, $3, $11}'# 记录到日志文件echo"[$(date'+%Y-%m-%d %H:%M:%S')] CPU 使用率:${cpu_usage}% (阈值:${THRESHOLD}%)">>"$LOG_FILE"fiecho""}# 主循环echo"开始 CPU 监控,检查间隔:${CHECK_INTERVAL}秒"echo"阈值:${THRESHOLD}%"echo"日志文件:$LOG_FILE"echo"按 Ctrl+C 停止监控"echo""whiletrue;domonitor_cpusleep"$CHECK_INTERVAL"done#!/bin/bash# 在 Docker 容器中合理分配 CPU 资源# 获取宿主机 CPU 核心数HOST_CORES=$(nproc--all)# 获取容器可用的 CPU 核心数(考虑 cgroup 限制)if[[-f/sys/fs/cgroup/cpuset/cpuset.cpus]];thenCONTAINER_CPUS=$(cat/sys/fs/cgroup/cpuset/cpuset.cpus)# 计算可用的核心数AVAILABLE_CORES=$(echo"$CONTAINER_CPUS"|tr',''\n'|whilereadrange;doif[[$range==*-*]];thenstart=${range%-*}end=${range#*-}seq$start $end|wc-lelseecho1fidone|paste-sd+|bc)elseAVAILABLE_CORES=$(nproc)fiecho"容器 CPU 配置:"echo"=============="echo"宿主机总核心数:$HOST_CORES"echo"容器可用核心数:$AVAILABLE_CORES"if[[-n"$CONTAINER_CPUS"]];thenecho"分配的 CPU:$CONTAINER_CPUS"fi# 根据可用核心数优化应用配置if[[$AVAILABLE_CORES-eq1]];thenecho"单核心环境,禁用并行处理"exportOMP_NUM_THREADS=1exportMKL_NUM_THREADS=1exportOPENBLAS_NUM_THREADS=1elif[[$AVAILABLE_CORES-le4]];thenecho"少核心环境,适度并行"exportOMP_NUM_THREADS=$AVAILABLE_CORESexportMKL_NUM_THREADS=$AVAILABLE_CORESexportOPENBLAS_NUM_THREADS=$AVAILABLE_CORESelseecho"多核心环境,充分并行"exportOMP_NUM_THREADS=$AVAILABLE_CORESexportMKL_NUM_THREADS=$AVAILABLE_CORESexportOPENBLAS_NUM_THREADS=$AVAILABLE_CORESfi# 启动应用echo"启动应用,线程配置:"echo"OMP_NUM_THREADS=$OMP_NUM_THREADS"echo"MKL_NUM_THREADS=$MKL_NUM_THREADS"echo"OPENBLAS_NUM_THREADS=$OPENBLAS_NUM_THREADS"#!/bin/bash# 智能并行任务调度器TASK_LIST=("task1""task2""task3""task4""task5""task6""task7""task8")TASK_DIR="/tmp/tasks"LOG_DIR="/var/log/parallel_tasks"# 创建目录mkdir-p"$TASK_DIR""$LOG_DIR"# 获取可用 CPU 核心数AVAILABLE_CORES=$(nproc)MAX_PARALLEL=$((AVAILABLE_CORES>4?AVAILABLE_CORES-2:AVAILABLE_CORES))echo"并行任务调度器启动"echo"=================="echo"可用 CPU 核心数:$AVAILABLE_CORES"echo"最大并行任务数:$MAX_PARALLEL"echo"总任务数:${#TASK_LIST[@]}"echo""# 任务处理函数process_task(){localtask_name="$1"localtask_id="$2"locallog_file="$LOG_DIR/${task_name}_$(date+%Y%m%d_%H%M%S).log"echo"[$(date'+%H:%M:%S')] 开始任务:$task_name(ID:$task_id)"|tee-a"$log_file"# 模拟任务执行(实际使用时替换为真实任务)sleep$((RANDOM%5+1))# 生成一些输出echo"任务$task_name处理中..."|tee-a"$log_file"echo"CPU 核心:$(nproc)"|tee-a"$log_file"echo"内存使用:$(free-m|awk'NR==2{printf "%.2f%%", $3*100/$2}')"|tee-a"$log_file"sleep$((RANDOM%3+1))echo"[$(date'+%H:%M:%S')] 完成任务:$task_name(ID:$task_id)"|tee-a"$log_file"echo"---"|tee-a"$log_file"}# 导出函数以便在子进程中使用export-fprocess_taskexportLOG_DIR# 使用 GNU parallel 或 xargs 进行并行处理ifcommand-vparallel&>/dev/null;then# 使用 GNU parallelprintf"%s\n""${TASK_LIST[@]}"|\parallel-j"$MAX_PARALLEL"--tag\"process_task {} {#} 2>&1"else# 使用 xargs 作为备选printf"%s\n""${TASK_LIST[@]}"|\xargs-I{}-P"$MAX_PARALLEL"\bash-c'process_task "$@"'_{}"$(date+%s)"fiecho""echo"所有任务完成"echo"日志文件保存在:$LOG_DIR"#!/bin/bash# 系统性能基准测试脚本echo"系统性能基准测试"echo"================"echo"测试时间:$(date)"echo""# 1. CPU 信息echo"1. CPU 信息:"echo"------------"echo"逻辑核心数:$(nproc--all)"echo"可用核心数:$(nproc)"# 获取详细 CPU 信息ifcommand-vlscpu&>/dev/null;thenecho""lscpu|grep-E"^(Model name|CPU MHz|CPU max MHz|CPU min MHz|Architecture|Thread\(s\) per core|Core\(s\) per socket|Socket\(s\))"fi# 2. CPU 性能测试echo""echo"2. CPU 性能测试:"echo"---------------"# 单核性能测试echo-n"单核性能测试: "timeforiin{1..1000000};doecho"scale=1000; 4*a(1)"|bc-l&>/dev/null;done# 多核性能测试AVAILABLE_CORES=$(nproc)echo-n"多核性能测试 ($AVAILABLE_CORES核心): "timeseq1"$AVAILABLE_CORES"|xargs-P"$AVAILABLE_CORES"-I{}bash-c'for i in {1..200000}; do echo "scale=500; 4*a(1)" | bc -l &>/dev/null; done'# 3. 内存测试echo""echo"3. 内存性能测试:"echo"---------------"ifcommand-vsysbench&>/dev/null;thenecho"使用 sysbench 进行内存测试..."sysbench memory --memory-block-size=1K --memory-total-size=10G run|grep-E"(total time|transferred|operations)"elseecho"安装 sysbench 以进行内存测试: sudo apt install sysbench"fi# 4. 磁盘 I/O 测试echo""echo"4. 磁盘 I/O 测试:"echo"----------------"TEST_FILE="/tmp/io_test.bin"echo-n"写入测试 (100MB): "ddif=/dev/zeroof="$TEST_FILE"bs=1Mcount=100oflag=direct2>&1|tail-1echo-n"读取测试: "ddif="$TEST_FILE"of=/dev/nullbs=1Miflag=direct2>&1|tail-1rm-f"$TEST_FILE"# 5. 系统负载echo""echo"5. 系统负载:"echo"-----------"uptimeecho""echo"CPU 使用率:"mpstat11|tail-2echo""echo"基准测试完成"# 查看当前进程的 CPU 亲和性taskset-p$$# 将进程绑定到特定 CPU 核心taskset-c0,2,4 ./program# 结合 nproc 动态绑定AVAILABLE_CORES=$(nproc)# 绑定到一半的核心taskset-c0-$((AVAILABLE_CORES/2-1))./program# 在脚本中设置 CPU 亲和性#!/bin/bash# 自动设置 CPU 亲和性TOTAL_CORES=$(nproc--all)# 为进程分配前一半的核心FIRST_HALF=$((TOTAL_CORES/2))CPU_LIST=$(seq-s','0$((FIRST_HALF -1)))echo"总核心数:$TOTAL_CORES"echo"分配的 CPU:$CPU_LIST"# 启动程序并设置 CPU 亲和性taskset-c"$CPU_LIST"./your_program#!/usr/bin/env python3# Python 中获取 CPU 核心数importosimportmultiprocessing# 方法1: 使用 os.cpu_count()print(f"逻辑 CPU 核心数:{os.cpu_count()}")# 方法2: 使用 multiprocessingprint(f"可用 CPU 核心数:{multiprocessing.cpu_count()}")# 方法3: 读取 /proc/cpuinfodefget_cpu_count_from_proc():try:withopen('/proc/cpuinfo','r')asf:returnlen([lineforlineinfifline.startswith('processor')])except:returnNoneprint(f"从 /proc/cpuinfo 获取:{get_cpu_count_from_proc()}")# 方法4: 调用 nproc 命令importsubprocessdefget_cpu_count_from_nproc():try:result=subprocess.run(['nproc'],capture_output=True,text=True)returnint(result.stdout.strip())except:returnNoneprint(f"从 nproc 命令获取:{get_cpu_count_from_nproc()}")#!/bin/bash# 在 Shell 脚本中获取 CPU 核心数的不同方法echo"各种获取 CPU 核心数的方法:"echo"=========================="# 方法1: nproc(推荐)echo"1. nproc:$(nproc)"# 方法2: nproc --allecho"2. nproc --all:$(nproc--all)"# 方法3: 从 /proc/cpuinfo 获取echo"3. /proc/cpuinfo:$(grep-cprocessor /proc/cpuinfo)"# 方法4: 使用 getconfecho"4. getconf _NPROCESSORS_ONLN:$(getconf _NPROCESSORS_ONLN)"# 方法5: 使用 lscpuecho"5. lscpu:$(lscpu|grep'^CPU(s):'|awk'{print $2}')"# 方法6: 使用 sysctl(macOS/BSD)ifcommand-vsysctl&>/dev/null;thenecho"6. sysctl hw.ncpu:$(sysctl-nhw.ncpu2>/dev/null||echo'N/A')"elseecho"6. sysctl: N/A (Linux only)"fi# 方法7: 使用 Pythonecho"7. Python os.cpu_count():$(python3-c"import os;print(os.cpu_count())"2>/dev/null||echo'N/A')" # 方法8: 使用 nproc 的替代实现 echo "8. 替代实现:$(cat/sys/devices/system/cpu/online2>/dev/null||echo'N/A')"nproc可能显示的是分配给虚拟机的核心数,而不是物理核心数nproc考虑进程的 CPU 亲和性设置,使用--all选项可忽略nproc显示的是逻辑核心数(包括超线程核心),不是物理核心数nproc可能受 cgroup 限制影响| 命令 | 说明 | 与 nproc 的关系 |
|---|---|---|
lscpu | 显示详细的 CPU 架构信息 | 提供更详细的 CPU 信息 |
taskset | 设置或获取进程的 CPU 亲和性 | 影响nproc的输出 |
cpuid | 显示 CPU 详细信息 | 更底层的 CPU 信息 |
top/htop | 实时显示系统进程和 CPU 使用率 | 显示 CPU 使用情况 |
mpstat | 显示每个 CPU 的统计信息 | 显示每个核心的使用率 |
nproc是系统管理和性能调优中非常有用的工具,特别适合在脚本中动态确定并行任务数量,以充分利用系统资源。