0

比如说,一个多线程应用程序在 8 核 Solaris 上运行。有没有办法列出每个线程和核心#之间的映射?

谢谢,

4

1 回答 1

1

首先,您可以编写 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。

于 2013-03-01T21:56:40.040 回答