centos多核优化?win10多核优化更好吗

大家好,centos多核优化相信很多的网友都不是很明白,包括win10多核优化更好吗也是一样,不过没有关系,接下来就来为大家分享关于centos多核优化和win10多核优化更好吗的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

SRS性能(CPU)、内存优化工具用法

SRS提供了一系列工具来定位性能瓶颈和内存泄漏,这些在./configure&& make后的 summary中是有给出来用法的,不过不是很方便,所以特地把用法写到这个文章中。

文中所有的工具,对于其他的linux程序也是有用的。

RTC是UDP的协议,先设置网卡队列缓冲区,下面命令是UDP分析常用的:

也可以修改系统文件/etc/sysctl.conf,重启也会生效:

查看接收和发送的丢包信息:

查看接收和发送的长度:

下面是netstat的一些参数:

PERF是Linux性能分析工具,参考[PERF](perf record-e block:block_rq_issue-ag)。

可以实时看到当前的SRS热点函数:

或者记录一定时间的数据:

记录堆栈,显示调用图:

GPROF是个GNU的CPU性能分析工具。参考 SRS GPROF,以及 GNU GPROF。

Usage:

GPERF是 google tcmalloc提供的cpu和内存工具,参考 GPERF。

GCP是CPU性能分析工具,就是一般讲的性能瓶颈,看哪个函数调用占用过多的CPU。参考 GCP。

Usage:

图形化展示,在CentOS上安装dot:

然后生成svg图片,可以用Chrome打开:

GMD是GPERF提供的内存Defense工具,检测内存越界和野指针。一般在越界写入时,可能不会立刻导致破坏,而是在切换到其他线程使用被破坏的对象时才会发现破坏了,所以这种内存问题很难排查;GMD能在越界和野指针使用时直接core dump,定位在那个出问题的地方。参考 GMD。

Usage:

GMC是内存泄漏检测工具,参考 GMC。

Usage:

GMP是内存性能分析工具,譬如检测是否有频繁的申请和释放堆内存导致的性能问题。参考 GMP。

Usage:

VALGRIND是大名鼎鼎的C分析工具,SRS3之后支持了。SRS3之前,因为使用了ST,需要给ST打PATCH才能用。

系统调用的性能排查,参考 centos6的性能分析工具集合

在OSX/Darwin/Mac系统,可以用Instruments,在xcode中选择Open Develop Tools,就可以看到Instruments,也可以直接找这个程序,参考 Profiling c++ on mac os x

还有DTrace可以用,参考动态追踪技术(中)- Dtrace、SystemTap、火焰图或者浅谈动态跟踪技术之DTrace。

多核时,一般网卡软中断在CPU0上,可以把SRS调度到其他CPU:

或者,指定SRS运行在CPU1上:

调整后,可以运行 top,然后按数字 1,可以看到每个CPU的负载:

或者使用 mpstat-P ALL:

如果是多CPU,比如4CPU,则网卡中断可能会绑定到多个CPU,可以通过下面的命令,查看网卡中断的绑定情况:

我们可以强制将网卡软中断绑定到CPU0,参考 Linux: scaling softirq among many CPU cores和 SMP IRQ affinity:

然后将SRS所有线程,绑定到CPU0之外的CPU:

如果要获取极高的性能,那么可以在SRS的启动脚本中,在启动SRS之前,执行绑核和绑软中断的命令。

可以设置SRS为更高的优先级,可以获取更多的CPU时间:

可以从ps中,看到进程的nice,也就是 NI字段:

CentOS下如何查看多核负载CentOS下查看多核负载的方法

1. Linux下,如何看每个CPU的使用率:

#top-M

之后按下数字1.(或者top之后按1也一样)则显示多个CPU的信息,和内存信息:

[root@testpc~]# top-M

top- 15:38:40 up 2 days, 2:05, 2 users, load average: 0.00, 0.00, 0.00

Tasks: 138 total, 1 running, 137 sleeping, 0 stopped, 0 zombie

Cpu0: 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Cpu1: 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Cpu2: 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Cpu3: 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 3725.047M total, 263.312M used, 3461.734M free, 45.711M buffers

Swap: 8095.992M total, 0.000k used, 8095.992M free, 55.977M cached

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+ COMMAND

1 root 20 0 19228 1512 1224 S 0.0 0.0 0:00.61 init

2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd

2.在Linux下,如何确认是多核或多CPU:

#cat/proc/cpuinfo

如果有多个类似以下的项目,则为多核或多CPU:

processor: 0

......

processor: 1

3.如何察看某个进程在哪个CPU上运行:

#top-d 1

之后按下f.进入top Current Fields设置页面:

选中:j: P= Last used cpu(SMP)

则多了一项:P显示此进程使用哪个CPU。

Sam经过试验发现:同一个进程,在不同时刻,会使用不同CPU Core.这应该是Linux Kernel SMP处理的。

4.配置Linux Kernel使之支持多Core:

内核配置期间必须启用CONFIG_SMP选项,以使内核感知 SMP。

Processor type and features---> Symmetric multi-processing support

察看当前Linux Kernel是否支持(或者使用)SMP

#uname-a

5. Kernel 2.6的SMP负载平衡:

在 SMP系统中创建任务时,这些任务都被放到一个给定的 CPU运行队列中。通常来说,我们无法知道一个任务何时是短期存在的,何时需要长期运行。因此,最初任务到 CPU的分配可能并不理想。

为了在 CPU之间维护任务负载的均衡,任务可以重新进行分发:将任务从负载重的 CPU上移动到负载轻的 CPU上。Linux 2.6版本的调度器使用负载均衡(load balancing)提供了这种功能。每隔 200ms,处理器都会检查 CPU的负载是否不均衡;如果不均衡,处理器就会在 CPU之间进行一次任务均衡操作。

这个过程的一点负面影响是新 CPU的缓存对于迁移过来的任务来说是冷的(需要将数据读入缓存中)。

记住 CPU缓存是一个本地(片上)内存,提供了比系统内存更快的访问能力。如果一个任务是在某个 CPU上执行的,与这个任务有关的数据都会被放到这个 CPU的本地缓存中,这就称为热的。如果对于某个任务来说,CPU的本地缓存中没有任何数据,那么这个缓存就称为冷的。

不幸的是,保持 CPU繁忙会出现 CPU缓存对于迁移过来的任务为冷的情况。

6.应用程序如何利用多Core:

开发人员可将可并行的代码写入线程,而这些线程会被SMP操作系统安排并发运行。

另外,Sam设想,对于必须顺序执行的代码。可以将其分为多个节点,每个节点为一个thread.并在节点间放置channel.节点间形如流水线。这样也可以大大增强CPU利用率。

例如:

游戏可以分为3个节点。

1.接受外部信息,声称数据(1ms)

2.利用数据,物理运算(3ms)

3.将物理运算的结果展示出来。(2ms)

如果线性编程,整个流程需要6ms.

但如果将每个节点作为一个thread。但thread间又同步执行。则整个流程只需要3ms.

从Unixbench的一个测试数据开始

很久之前,有人发现使用不同内核版本进行Unixbench测试时,跑分存在较大差异。具体为,内核版本4.18与版本5.15之间的比较。测试环境为标准的CentOS Stream release 8。版本4.18通过CentOS标准的yum下载,而版本5.15则是从kernel.org下载的最新tarball。

分析发现,版本5.15在多线程并发时导致性能大幅下降。这表明问题可能与多线程或多进程性能有关。Process creation和pipe-based context switch测试结果也显示了多线程问题。考虑到版本5.15在部分测试中的性能相比4.18最差,研究者决定集中关注这一问题。

通过代码阅读,研究者发现了一个简单的测试场景:两个进程通过Linux pipeline文件进行通讯,一边读一边写。测试的关键在于上下文切换,而每个while循环至少包含2次user->kernel,2次kernel->user操作。这表明主要的时间消耗集中在上下文切换上。

为了进一步分析,研究者增加进程数量进行测试。结果显示,在进程数较少时,5.15和4.18的跑分接近。但当进程数达到48以上时,5.15等于4.18;在96进程之后,5.15开始出现下滑,直至192进程后,4.18全面赶超5.15。曲线拐点与CPU拓扑匹配,表明5.15的特征可能是某种调度优化或保护机制的问题。

在进一步调查中,发现5.15中默认值为1的sched_autogroup_enabled配置导致了问题。关闭该配置后,性能提升100%。因此,问题在于配置不当,与内核版本无关。

autogroup功能在Linux 2.6.38版本中引入,旨在优化桌面性能,特别是在多进程、CPU密集型工作负载下。然而,在当前的测试场景中,这一功能并未发挥作用,反而可能成为性能瓶颈。考虑到CentOS没有官方的5.x内核发布,推测测试内核可能基于桌面版本的内核进行修改。

在过去的15年中,CPU架构发生了巨大变化,而autogroup功能可能在现代多核处理器中成为反优化。Unixbench测试仅考虑了8进程性能,没有考虑到调度算法的影响。至于另一个测试项目superpi,其调试已无必要。

阅读剩余
THE END