首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

超线程加快了 Linux 的速度 单处理器上的多处理器性能-2

超线程加快了 Linux 的速度 单处理器上的多处理器性能-2

超线程对 Linux API 的影响超线程对 Linux API 的影响通过 LMbench 来测量,LMbench 是包含一套带宽和延迟测量方法的微基准测试程序。这些影响中涉及了高速缓存文件读取、内存复制(bcopy)、内存读/写(和延迟)、管道、上下文切换、联网、文件系统的创建和删除、进程的创建、信号处理以及处理器时钟延迟。LMbench 着重测量以下内核组件:调度程序、进程管理、通信、联网、内存映射和文件系统。低级内核原语提供一个很好的、底层硬件能力和性能的指示器。
为研究超线程的效果,我们着重于延迟的测量,它测量消息控制的时间(换句话说,系统执行某个操作能有多快)。延迟的数量用“微秒/操作”进行记录。
表 1 显示了用 LMbench 进行测试的部分内核功能列表。每个数据点是三次运行的平均值,而且该数据已经作过收敛测试,以保证在相同的测试环境条件下它们是可再现的。通常,对于那些作为单线程运行的功能来说,有超线程和无超线程之间没有什么性能差别。然而,对于那些需要运行两个线程的测试(例如,管道延迟测试和三个进程延迟测试)来说,超线程似乎延长了它们的延迟时间。已配置的现有的 SMP 内核被标为 2419s。如果配置的内核不支持超线程,则将其标为 2419s-noht。若有超线程支持,则该内核被列为 2419s-ht。
表 1. 超线程对 Linux API 的影响内核函数2419s-noht2419s-ht加速简单的 syscall1.101.100%简单的 read1.491.490%简单的 write1.401.400%简单的 stat5.125.140%简单的 fstat1.501.500%简单的 open/close7.387.380%对 10 个 fd 的选择5.415.410%对 10 个 tcp fd 的选择5.695.700%信号处理程序安装1.561.550%信号处理程序开销4.294.270%管道延迟11.1611.31-1%进程 fork+exit190.75198.84-4%进程 fork+execve581.55617.11-6%进程 fork+/bin/sh -c3051.283118.08-2%注:数据用微秒表示:越小越好。管道延迟的测试使用了两个通过 UNIX 管道进行通信的进程来测量经由套接字的进程间通信延迟。基准测试程序在这两个进程之间来回传送标记。性能下降幅度为 1%,小得可以忽略不计。
这三个进程测试包括了在 Linux 中进行的进程创建和执行。目的是测量创建基本控制线程所花去的时间。对于进程 fork+exit 测试来说,该数据表示将一个进程分成两个(几乎)相同的副本并退出其中一个所花的延迟时间。新进程就是这么创建的 - 但这不是非常有用,因为两个进程执行相同的操作。在这个测试中,超线程造成的性能下降幅度为 4%。
在进程 fork+execve 中,数据表示创建新进程并让该新进程运行新程序所花的时间。这是所有 shell(命令解释器)的内循环。由于超线程,可以看到这个测试性能下降幅度为 6%。
在进程 fork+/bin/sh -c 测试中,数据表示创建新进程并使该新进程运行新程序(通过让系统 shell 查找该程序并运行它)所要花去的时间。C 库接口就是这样实现对系统的调用。这个调用最常见,也最费时。在使用超线程的情况下,相对不用超线程而言,运行本测试慢了 2%。
超线程对 Linux 单用户应用程序工作负载的影响AIM9 基准测试程序是单用户工作负载,旨在测量硬件和操作系统的性能。结果如表 2 所示。该基准测试程序中的大多数测试在使用超线程和不用超线程情况下执行性能都相同,只是同步文件操作和整数过滤(Integer Sieve)有所不同。同步随机磁盘写操作(Sync Random Disk Writes)、同步顺序磁盘写操作(Sync Sequential Disk Writes)和同步磁盘复制(Sync Disk Copies)这三个操作在使用超线程的情况下都慢了将近 35%。相反,在整数过滤的情况下使用超线程比不使用超线程速度提高了 60%。
表 2. 超线程对 AIM9 工作负载的影响

2419s-noht2419s-ht加速add_double每秒钟的双精度加法运算次数(千次)6383616377240%add_float每秒钟的单精度加法运算次数(千次)6384006377620%add_long每秒钟的长整型加法运算次数(千次)147904114790410%add_int每秒钟的整型加法运算次数(千次)148354914910171%add_short每秒钟的短整型加法运算次数(千次)148080014784000%creat-clo每秒钟的文件创建和关闭次数1291001397008%page_test每秒钟的系统分配和换页数1613301618400%brk_test每秒钟的系统内存分配次数6334666358000%jmp_test每秒钟的非本地 goto 次数866690086948000%signal_test每秒钟的信号陷阱数1423001429000%exec_test每秒钟的程序装入次数3873870%fork_test每秒钟的任务创建次数236524473%link_test每秒钟的链接/解链对数54142591699%disk_rr每秒钟的随机磁盘读取数(K)85758895104%disk_rw每秒钟的随机磁盘写入数(K)76800784552%disk_rd每秒钟的顺序磁盘读取数(K)3519043568641%disk_wrt每秒钟的顺序磁盘写入数(K)1541121563591%disk_cp每秒钟的磁盘复制数(K)1043431062832%sync_disk_rw每秒钟的同步随机磁盘写入数(K)239155-35%sync_disk_wrt每秒钟的同步顺序磁盘写入数(K)9760-38%sync_disk_cp每秒钟的同步磁盘复制数(K)9760-38%disk_src每秒钟的目录搜索次数4891548195-1%div_double每秒钟的双精度除法运算次数(千次)37162372020%div_float每秒钟的单精度除法运算次数(千次)37125372020%div_long每秒钟的长整型除法运算次数(千次)27305273600%div_int每秒钟的整型除法运算次数(千次)27305273320%div_short每秒钟的短整型除法运算次数(千次)27305273600%fun_cal每秒钟的函数调用(没有参数)次数3033126830105600-1%fun_cal1每秒钟的函数调用(1 个参数)次数1124352001128448000%fun_cal2每秒钟的函数调用(2 个参数)次数97587200978432000%fun_cal15每秒钟的函数调用(15 个参数)次数44748800448000000%sieve每秒钟的整数过滤次数152460%mul_double每秒钟的双精度乘法运算次数(千次)4562874567430%mul_float每秒钟的单精度乘法运算次数(千次)4560004567430%mul_long每秒钟的长整型乘法运算次数(千次)1679041681680%mul_int每秒钟的整型乘法运算次数(千次)1679761682160%mul_short每秒钟的短整型乘法运算次数(千次)1557301559100%num_rtns_1每秒钟的数字函数个数92740929200%trig_rtns每秒钟的三角函数个数4040004050000%matrix_rtns每秒钟的点转换次数8751408913002%array_rtns每秒钟解决的线性系统数5795780%string_rtns每秒钟的字符串操作次数256025640%mem_rtns_1每秒钟的动态内存操作次数9820359800190%mem_rtns_2每秒钟的块内存操作次数2145902153900%sort_rtns_1每秒钟的排序操作次数481472-2%misc_rtns_1每秒钟的辅助循环次数79167864-1%dir_rtns_1每秒钟的目录操作次数200200020010000%shell_rtns_1每秒钟的 Shell 脚本数95972%shell_rtns_2每秒钟的 Shell 脚本数95961%shell_rtns_3每秒钟的 Shell 脚本数95972%series_1每秒钟的级数求值次数316527031896301%shared_memory每秒钟的共享内存操作次数1740801742200%tcp_test每秒钟的 TCP/IP 消息数65835662311%udp_test每秒钟的 UDP/IP 数据报数1118801121500%fifo_test每秒钟的 FIFO 消息数2289202289000%stream_pipe每秒钟的流管道消息数1702101710600%dgram_pipe每秒钟的数据报管道消息数1683101705601%pipe_cpy每秒钟的管道消息数245090243440-1%ram_copy每秒钟的内存到内存复制次数4900267084924786681%
返回列表