【问题标题】:User space Vs Kernel space program performance difference用户空间与内核空间程序性能差异
【发布时间】:2012-06-30 07:55:17
【问题描述】:

我有一个顺序用户空间程序(某种内存密集型搜索数据结构)。该程序的性能(以 CPU 周期数衡量)取决于底层数据结构的内存布局和数据缓存大小 (LLC)。

到目前为止,我的用户空间程序已经调到死了,现在我想知道是否可以通过将用户空间代码移入内核(作为内核模块)来获得性能提升。我可以想到以下提高内核空间性能的因素...

  1. 没有系统调用开销(每个系统调用获得多少 CPU 周期)。这不太重要,因为我在程序中几乎没有使用任何系统调用,除了在程序启动时分配内存。
  2. 控制调度,我可以创建一个内核线程并使其在给定的内核上运行而不会被丢弃。
  3. 我可以使用 kmalloc 内存分配,因此可以更好地控制分配的内存,还可以通过控制分配的内存来更精确地控制缓存着色。值得一试吗?

我对内核专家的问题...

  • 我是否遗漏了上述列表中可以进一步提高性能的任何因素?
  • 值得尝试还是直接知道我不会获得太多性能提升?
  • 如果内核中的性能提升是可能的,是否有任何估计可以提升多少(任何理论上的猜测)?

谢谢。

【问题讨论】:

  • 移动 CPU 密集型用户空间程序所带来的性能提升很小。在调试和使程序系统崩溃的能力方面,陷阱和复杂性都非常重要。 IMO,这条途径是不值得的;算法优化总会带来更好的回报。

标签: performance caching kernel cache-control


【解决方案1】:

关于第 1 点:内核线程仍然可以被抢占,因此除非您进行大量系统调用(您不是),否则这不会给您带来太多收益。

关于第 2 点:您可以通过在 Linux 上使用 sched_setaffinity() 设置其亲和性来将线程固定到特定内核。

关于第 3 点:您期望什么额外的控制?您已经可以使用mmap() 从用户空间分配页面对齐的内存。这已经让您可以控制缓存的集合关联性,并且您可以将内联汇编或编译器内在函数用于任何手动预取提示或非临时写入。在内核和用户空间中分配的内存之间的主要区别在于kmalloc() 分配有线(不可分页)内存。我不明白这会有什么帮助。

我怀疑您会在使用 SIMD、多线程或进行进一步算法或内存优化的并行化方面看到更好的投资回报率。

【讨论】:

  • 关于第 3 点:我确信使用 mmap() 我可以控制缓存的集合关联性。使用 kmalloc() 可以分配不可交换的内存,可以通过 mmap() 和 mlock() 系统调用来模拟。但是使用 kmalloc,我们还可以获得物理上连续的内存——它是否有助于提高性能(内存的硬件预取)?
  • @NitinKunal 预取在虚拟内存级别工作:如果页面不驻留,预取的内存访问可以并且确实触发页面错误。 (这适用于 CPU 的内部预读和显式预取指令)如果页面驻留,但页表项不在 TLB 中,则会导致查找页表项并提前将其添加到 TLB。内存在物理上是否连续无关紧要:CPU 不“知道”这一点,它必须检查 TLB 或页表。连续内存仅对 DMA 有用。
【解决方案2】:

为您的程序创建一个专用的cpuset 并将所有其他进程移出它。然后使用 FIFO 调度策略将您的进程的优先级提高到实时:

struct sched_param schedparams;
// Be portable - don't just set priority to 99 :)
schedparams.sched_priority = sched_get_priority_max(SCHED_FIFO);
sched_setscheduler(0, SCHED_FIFO, &schedparams);

不要在单核系统上这样做!

使用alloca(3) 保留足够大的堆栈空间并触及所有分配的堆栈内存,映射足够多的堆空间,然后使用mlock(2)mlockall(2) 固定进程内存。

即使您的程序是顺序程序,如果在多路 Nehalem 或 post-Nehalem Intel 系统或 AMD64 系统上运行,NUMA 效果也会减慢您的程序。使用来自numa(3) 的 API 函数来分配和保持内存尽可能靠近执行程序的 NUMA 节点。

尝试其他编译器 - 其中一些可能比您当前使用的编译器优化得更好。例如,英特尔的编译器在布局指令方面非常激进,以便从乱序执行、流水线和分支预测中受益。

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多