比如说,一个多线程应用程序在 8 核 Solaris 上运行。有没有办法列出每个线程和核心#之间的映射?
谢谢,
首先,您可以编写 C 代码来查询进程中的每个线程 Open /proc/[id]/lwp/[tid]/lwpsinfo
there 并将其获取到lwpsinfo_t
定义的结构中procfs.h
processorid_t pr_onpro; /* processor which last ran this lwp */
processorid_t pr_bindpro; /* processor to which lwp is bound */
是你感兴趣的两个成员。在你浪费时间之前
接下来在您浪费大量时间之前(假设区域):
prctl -i zone {ZONENAME}
仅在全局区域中由 root 运行。你会得到这样的输出:
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
zone.max-swap
system 16.0EB max deny -
zone.max-locked-memory
system 16.0EB max deny -
zone.max-shm-memory
system 16.0EB max deny -
zone.max-shm-ids
system 16.8M max deny -
zone.max-sem-ids
system 16.8M max deny -
zone.max-msg-ids
system 16.8M max deny -
zone.max-lwps
system 2.15G max deny -
zone.cpu-cap
privileged 1.20K - deny -
system 4.29G inf deny -
zone.cpu-shares
privileged 1 - none -
system 65.5K max none -
zone.cpu-cap 1.20K 表示 1200 == 表示百分比。所以 1200 意味着 12 个 CPU。如果我是您的管理员,则 DEV 或 TEST 区域不可能有 64 个内核。所以先检查一下。
另外,您的假设似乎是错误的。除非启用了亲和性(处理器集等),否则系统会使用当前启用的调度算法(FSS 等)将 cpu 分配给线程。这意味着任何线程都可以根据调度程序和负载随时访问任何可用的 cpu。