如何开启Linux NUMA支持? (linux numa enable)

NUMA(Non-Uniform Memory Access)是一种硬件架构设计,它可以让多个CPU访问多个内存区域。在NUMA架构中,每个CPU只能访问其本地节点(也就是自身所在的内存区域),而要访问其他节点的内存,则需要通过网络或其他高速通道进行访问。

对于一些需要大量数据处理的应用程序来说,NUMA架构可以提高系统的整体性能和效率。因此,在使用Linux系统时,开启NUMA支持是非常有必要的。

本文将介绍如何在Linux系统中开启NUMA支持,并对一些常见问题进行解答。

Step 1:检查NUMA支持

在开始之前,需要先检查系统是否支持NUMA。在Linux系统中,可以通过以下命令检查NUMA支持情况:

“`bash

lscpu | grep “NUMA node(s)”

“`

如果系统支持NUMA,则会输出类似下面的结果:

“`

NUMA node(s): 2

NUMA node0 CPU(s): 0-7

NUMA node1 CPU(s): 8-15

“`

Step 2:安装NUMA工具

在Linux系统中,需要安装numactl工具来管理NUMA。可以通过以下命令来安装numactl:

“`bash

sudo apt-get install numactl

“`

Step 3:使用numactl命令

安装完numactl工具后,就可以使用numactl命令来控制NUMA节点了。以下是一些常用的numactl命令:

1. numactl –hardware:显示系统中的NUMA节点和CPU信息。

2. numactl –show:显示当前进程的NUMA节点和CPU信息。

3. numactl –cpunodebind=NODELIST command:将进程绑定到指定的NUMA节点。

4. numactl –membind=NODELIST command:将进程的内存绑定到指定的NUMA节点。

Step 4:配置NUMA支持

现在,我们来看看如何开启Linux系统的NUMA支持。

1. 编辑/etc/default/grub文件,将GRUB_CMDLINE_LINUX_DEFAULT行修改为:

“`bash

GRUB_CMDLINE_LINUX_DEFAULT=”numa=on”

“`

2. 更新Grub配置:

“`bash

sudo update-grub

“`

3. 重启系统以应用新的Grub配置:

“`bash

sudo reboot

“`

完成上述步骤后,系统就会开启NUMA支持了。

Step 5:解决常见问题

1. 如何检查进程是否绑定到指定的NUMA节点?

可以使用numactl –show命令来查看进程的NUMA绑定情况。

2. 如何避免NUMA造成的性能瓶颈?

要避免NUMA造成的性能瓶颈,可以通过以下几种方式:

– 绑定进程到指定的NUMA节点。

– 将进程的内存分布在不同的NUMA节点上。

– 优化进程的访问模式,使其访问本地NUMA节点的内存。

3. 如何在NUMA架构下使用大页?

在NUMA架构下,使用大页(Huge Page)可以提高性能。可以通过以下命令来开启大页支持:

“`bash

sysctl vm.nr_hugepages=NUM_PAGES

“`

其中NUM_PAGES表示需要的大页数。

4. 如何检查NUMA的开启情况?

可以使用numactl –hardware命令来查看系统中的NUMA节点和CPU信息。

NUMA架构在需要大量数据处理的应用程序中可以提高系统的整体性能和效率。在Linux系统中,开启NUMA支持非常容易,只需按照本文中的步骤操作即可。如果遇到问题,可以参考本文中的常见问题解答。

相关问题拓展阅读:

升级Linux操作系统内核奋斗记

升级linux内核奋斗记

我的piii dell机运行着内核2.4.的redhat,自从linux内核2.6发布以来一直想把该系统升级到内核2.6。经过一番艰辛万苦,终于成功了。为了体验一下在linux下编写多线程程序的步骤,又更新gcc和c语言库。在此愿和各位朋友共享这段经历,共享这段成果。(可能有记录错误,仅供参考)。

具体步骤包括以下内容:

1,升级内核的具体步骤

2,更新gcc

3,使用glibc2.3.5

4,使用nptl线程进行编程

在此之前,先简要地介绍一下linux内核2.6所做的改进及新增功能。linux2.6主要在以下的10个方面作了很大的改进,简单概括如下,有关详细情况,请参阅相关资料。

1)通过改善并行处理能力和采用posix线程等,提高了系统的处理能罩亏信力,从而linux真正具备大型信息系统所要求性能。

2)通过改善文件系统的输出/输入能力和提高对大容量内存的利用效率,使得linux能够更胜任大型信息系统中的数据处理。

3)加强了对数物轮据库应用程序的支持。

4)提高了抗系统高负荷时能力。

5)提高了系统的可用性,包括对不停机空此时备份和不停机时更换硬件功能的支持。

6)强化了对网络的支持,增加了对ipv6, sctp, ipsec,等的支持。

7)通过增加访问控制和内核暗号化技术,提高了系统的安全性。

8)强化了对电源的管理。

9)强化了对嵌入式cpu和系统的支持。

10)添加了更多的硬件驱动程序。

一.升级内核

1, 下载linux-2.6.3.tar.bz2(可以是更新的版本)到/usr/src

bzcat linux-2.6.3.tar.bz2 | tar xvf – cd linux-2.6.阅读readme及changes 文件,确认必须的工具软件。因为不是笔记本电脑和笔记本电脑有关的软件可以忽略。发现module-init-tools需要更新。

2,下载module-init-tools-0.9.13.tar.bz2

bzcat module-init-tools-0.9.13.tar.bz2 | tar xvf – cd module-init-tools-0.9.13 ./configure –prefix=/usr/local/module-init make make moveold make install /usr/local/module-init/in/generate-modpobe.conf > /etc/modprobe.conf成功。

3, 编译linux内核

cd /usr/src/linux-2.6.3 make menuconfig一看太麻烦了,而且许多选项不知所云。退出该程序。 执行make oldconfig,对kernel2.6新增的不熟悉的选项作不选或为缺省。

make bzimage make modules modules_install pwd /usr/src/linux-2.6.3 mv arch/i386/boot/bzimage /boot/bzimage2.6.3 mv system.map /boot/system.map-2.6.3 cd /boot mv system.map oldsystem.map ln –s system.map-2.6.3 system.map,建立sys目录

mkdir /sys

5, 修改相关文件,增加对sys的支持

在/etc/rc.d/rc.sysinit文件增加对sys的支持。

1) 找到mount –f /proc的行,在其下面,增加 mount –f /sys

2) 找到 action $ “mounting proc filesystem:” mount –n –t proc /proc /proc 在其下面,增加action $ “mounting sysfs filesystem:” mount –n –t sysfs /sys /sys.

3) 把文件中的 ksyms 改成 kallsyms

在/etc/fstab文件中,增加一行:

none /sys sysfs defaults 0 0

在/etc/rc.d/init.d/halt中,增加对sys的支持,把 awk ‘$2 ~/^/$ | ^/proc | ^/dev / {next} 变为:

awk ‘$2 ~/^/$ | ^/proc | ^/sys | ^/dev / {next}

6,启动

修改/etc/lilo.conf, 增加下面的设置

… image=/boot/bzimange2.6.3 label=linux2.6.3 read-only root=/dev/hda3(由自己的pc设置决定)成功。

二,更新gcc (因为gcc2.95.3无法编译glibc-2.3.5)

下载gcc-3.4.4.tar.bz2

bzcat gcc-3.4.4.tar.bz2 | tar xvf – cd gcc-3.4.4 ./configure –prefix=/usr/local/gcc344 –enable-shared –enable-threads –enable-threads=posix –enable-languages=c,c++,f77 make bootstrap (因为使用cflags选项时,出错了,所以省略) make install ln –s /usr/local/gcc344/bin/gcc /usr/bin/gcc

三,使用glibc-2.3.5

1)、通过调查发现要编译glibc-2.3.5,要求binutils在2.13以上。所以必须安inutils-2.14

下载binutils-2.14.tar.gz

tar zxpvf binutils-2.14.tar.gz mkdir binutils-build cd binutils-build ../binutils-2.14/configure –prefix=/usr –enable-shared make tooldir=/usr make check make tooldir=/usr install cp ../binutils-2.14/include/libiberty.h /usr/include) 安装glibc-2.3.5

下载 glibc-2.3.5.tar.gz 和 glibc-2.3.5-fix_test-1.patch

tar zxpvf glibc-2.3.5.tar.gz patch –np1 –i ../glibc-2.3.5-fix_test-1.path mkdir glibc-build cd glibc-build ../glibc-2.3.5/configure –prefix=/usr/local/glibc235 –enable-add-ons=linuxthreads –enable-kernel=2.6.0 (若安装在/usr目录下,很危险,可能会损坏你的系统) make make check (必须执行的一步) make localedata /install-locales (对应各国文字) mkdir /usr/man/man3(man的安装路径) make –c ../glibc-2.3.5/linuxthreads/man install上面的安装完成以后,更好把/usr/local/glibc235/lib和/usr/local/glibc235/include加入到系统的路径中,这样在编译程序时,就不必指定库和header文件的路径了。

四、使用nptl进行线程编程

#include #include #include #include void thread_fun(void * arg); char message = “i am created thread”; int main() { int rnt; pthread_t new_thread; void *thread_result; rnt=pthread_create(&new_thread,null, thread_fun, (void*) message); if (rnt != 0) { perrer (“thread creation failed”); exit(exit_failure); } printf(“waiting for other thread to finish…”); rnt = pthread_join(new_thread, &thread_result); if (rnt != 0) { perrer (“thread join failed”); exit(exit_failure); } printf(“thread join, it returned %s ”, (char*) thread_result); printf(“message now %s”, message); exit(exit_success); } void *thread_fun (void * arg) { printf(“the new thread is running. argument was %s”,(char*)arg); sleep(3); strcpy(message, “bye”); pthread_exit(“thank you for the test”); }编译

gcc -d_reentrant test_thread.c -o test_thread -lpthread ./test_thread成功了。

如何在ARM Linux内核中使用硬件断点

在ARM Linux内核中使用硬件断点

一般的CPU都支持硬件断点,也就是通过处理器提供专门断点寄存器保存一个地址,处理器在执行程序过程,会不断去匹配,可以设置成不同的模式迅碧来触发程序中断,如执行到这个地址,读这个地址或写这个地址, 并且可以设置长度,按8位,16位,或32位来触发。和软件断点比,好处是可以团激支持读写断点,程序断点不需要改写内存,可以设在ROM中,在虚拟地址映射前也可设置等等。

X86, ARMv5架构以上都可以支持硬件断点,如是ARM9上可以支持2个,最新ARMv8规范指定2-8个。

除了Jtag调试器可以支持硬件断点,在Linux内核中,也可以支持硬件断点。

相关的配置 CONFIG_HAVE_HW_BREAKPOIN

下面以3.18 Android内核上的ARM64为例,列举具体步骤:

在3.18上,这个配置没有写入亩或举menuconfig,所以首先修改Kconfig

kernel/arch/arm64/Kconfig.debug,加入

config HAVE_HW_BREAKPOINT

bool “Hardware Breakpoint support”

default y

help

If this option is hardware breakpoint

If in doubt, say N.

2.然后在已编译过的Android根目录环境下:

make -C kernel O=../out/target/product//obj/KERNEL_OBJ ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- KCFLAGS=-mno-android -j8 menuconfig 11

在”Kernel hacking”菜单下可以找到这一选项,同时还要把

Sample kernel code/Build kernel hardware breakpoint examples — loadable module only11

选上。

因为目前安卓内核都已经把模块签名打开, 为了方便调试,可能暂时关掉:

Main Menu/Enable loadable module support – Require modules to be validly signed11

3.然后重编内核和bootimage,同进把samples module:data_breakpoint.ko也编出来

make -C kernel O=../out/target/product//obj/KERNEL_OBJ ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- KCFLAGS=-mno-android -j8 m=samples11

把生成的bootimage重新烧入手机,并且把data_breakpoint.ko也推送入

adb push /out/target/product//obj/KERNEL_OBJ/samples/hw_breakpoint/data_breakpoint.ko /data/test11

4.接下来就可以使用了,用法是插入data_breakpoint.ko模块,用符号作参数

如:

inod hw_breakpoint.ko ksym=totalram_pages

totalram_pages变量是内存总的页大小,在cat /proc/meminfo时会读它

这时就会触发硬件断点,内核会打印中整个调用栈。

5.data_breakpoint.ko中,缺省是读写断点,可以在这个sample code的基础上,继续增强,通过不同的参数在使能只读断点或只写断点,包括长度。

代码位于内核中samples/hw_breakpoint/data_breakpoint.c

通过HW_BREAKPOINT_W和HW_BREAKPOINT_R来设置

static int __init hw_break_module_init(void)

{

int ret;

struct perf_event_attr attr;

hw_breakpoint_init(&attr);

attr.bp_addr = kallsyms_lookup_name(ksym_name);

attr.bp_len = HW_BREAKPOINT_LEN_4;

attr.bp_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R;

linux numa enable的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux numa enable,如何开启Linux NUMA支持?,升级Linux操作系统内核奋斗记,如何在ARM Linux内核中使用硬件断点的信息别忘了在本站进行查找喔。


数据运维技术 » 如何开启Linux NUMA支持? (linux numa enable)