linux绑核命令 linux进程绑核

如何将一个进程(线程)绑定到一个固定的CPU

第一种:linux的shell命令行方式,命令名字为taskset。第二种就是代码实现级别的了,pthread_setaffinity_np和sched_setaffinity函数接口。

成都创新互联公司拥有十载成都网站建设工作经验,为各大企业提供网站设计、成都网站建设服务,对于网页设计、PC网站建设(电脑版网站建设)、app开发定制、wap网站建设(手机版网站建设)、程序开发、网站优化(SEO优化)、微网站、申请域名等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了很多网站制作、网站设计、网络营销经验,集策划、开发、设计、营销、管理等网站化运作于一体,具备承接各种规模类型的网站建设项目的能力。

第一种方式我已经验证过了,确实可行。同时验证了我心中的疑问:如果将某个线程绑定到某个物理核上之后,在此线程运行结束前,会不会有别的线程被调度到此物理核上执行? 写了一个死循环验证了下,发现绑定之后是不会调度别的线程在此核上运行的!(肉眼观察的,时不时观察下,没发现别的线程在此核上执行;对比了下没有绑定的情况,会发现过段时间此线程就会被调度到别的核心上执行)

此种方式有个问题,就是只有线程运行起来后才会被绑定到某个核上,不够及时。

具体的方式为:

1.首先根据系统的差别运行如下安装命令:

sudo apt-get install util-linux (Debian,Ubuntu or Linux Mint)

sudo yum install util-linux (Fedora,CentOS or RHEL)

2.相关命令的使用:

2.1 使用命令 taskset -p PID 来获得此Process的 CPU affinity。

eg: taskset -p 2915 ------ pid 2915's current affinity mask:ff; ff=="1111 1111",没一个1代表一个核,共8个核,能用的核数也为8个核。

2.2 使用命令 taskset -cp PID 可获得数字形式的CPU affinity。

eg: taskset -cp 2915 ------ pid 2915's current affinity list: 0--7。

接下来为将进程pin到某个核上的命令;

2.3 taskset -p COREMASK PID

eg:taskset -p 0x11 9030 ------pid 9030's current affinity mask: ff , pid 9030's new affinity mask: 11 。意思就是将此进程绑定到了CPU core 0 and 4。

2.4 taskset -cp CORE-LIST PID

eg:taskset -cp 0,4 9030 ------the same as below.

With "-c" option, you can specify a list of numeric CPU core IDs separated by commas, or even include ranges (e.g., 0,2,5,6-10).

2.5 taskset COREMASK EXECUTABLE

eg: taskset 0x1 xxxx -----"xxxx" represented the name of one program.

另外:参考文章最后的位置说到,绑定到此物理核之后,别的进程(线程)还可以调度到此核上执行,但是没说绑定的这个线程没执行完之前是否会被别的线程挤掉。根据我的观察是不会被挤掉,这我在文章的开头也有提到。

linux 查看线程绑定在哪个核心 proc

使用top命令,具体用法是 top -H,加上这个选项,top的每一行就不是显示一个进程,而是一个线程。

使用ps命令,具体用法是 ps -xH,这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。

使用ps命令,具体用法是 ps -mq PID,这样可以看到指定的进程产生的线程数目。

更进一步,其实一些系统监控工具,在本质上也是读取的系统产生的文件罢了。

Linux如何将进程绑定运行在指定CPU上

绑定cpu方式:

c语言:

sched_setaffinity(0, sizeof(mask), mask)

shell命令:

在grup启动时传给内核参数: isolcpus=2-15, 这里表示隔离第3到16个CPU, Linux程序只跑在第一和第二个CPU上, 空闲的CPU我们可以指定跑进程了.

这是内核文档里对内核参数的解释:

isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.

Format:

cpu number,...,cpu number

or

cpu number-cpu number

(must be a positive range in ascending order)

or a mixture

cpu number,...,cpu number-cpu number

This option can be used to specify one or more CPUs

to isolate from the general SMP balancing and scheduling

algorithms. You can move a process onto or off an

"isolated" CPU via the CPU affinity syscalls or cpuset.

cpu number begins at 0 and the maximum value is

"number of CPUs in system - 1".

This option is the preferred way to isolate CPUs. The

alternative -- manually setting the CPU mask of all

tasks in the system -- can cause problems and

suboptimal load balancer performance.

linux nice 命令详解

功能说明:设置优先权。

语法:nice [-n 优先等级][--help][--version][执行指令]

补充说明:nice指令可以改变程序执行的优先权等级。

参数:-n优先等级或-优先等级或--adjustment=优先等级  设置欲执行的指令的优先权等级。等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。

--help  在线帮助。

   --version  显示版本信息。

linux renice 命令详解

功能说明:调整优先权。

语法:renice [优先等级][-g 程序群组名称...][-p 程序识别码...][-u 用户名称...]

补充说明:renice指令可重新调整程序执行的优先权等级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。等级范围从-20--19,只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。

参数:

-g 程序群组名称  使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。

-p 程序识别码  改变该程序的优先权等级,此参数为预设值。

-u 用户名称  指定用户名称,修改所有隶属于该用户的程序的优先权。

taskset设定cpu亲和力,cpu亲和力是指

CPU调度程序属性关联性是“锁定”一个进程,使他只能在一个或几个cpu线程上运行。对于一个给定的系统上设置的cpu。给定CPU亲和力和进程不会运行在任何其他CPU。注意,Linux调度器还支持自然CPU关联:(不能让这个cpu只为这一个进程服务)

这里要注意的是我们可以把某个程序限定在某一些CPU上运行,但这并不意味着该程序可以独占这些CPU,其实其他程序还是可以利用这些CPU运行。如果要精确控制CPU,taskset就略嫌不足,cpuset才是可以

-a, --all-tasks 操作所有的任务线程-p, --pid 操作已存在的pid-c, --cpu-list 通过列表显示方式设置CPU

(1)指定1和2号cpu运行25718线程的程序

taskset -cp 1,2 25718

(2),让某程序运行在指定的cpu上 taskset -c 1,2,4-7 tar jcf test.tar.gz test

(3)指定在1号CPU上后台执行指定的perl程序

taskset –c 1 nohup perl pi.pl

资深Linux运维工程师必须掌握的核心命令

查看CPU信息可以使用lscpu命令

从命令的输出结果可以看得出来CPU的型号是 Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz,CPU(s)是4表示同时可以执行四个任务。

如果想要同时执行更多的任务,可以在VMware WorkStation中修改,修改完成以后会立即生效。

除了lscpu以外,还可以使用cat /proc/cpuinfo命令查看CPU信息,不过它是以每核分开显示的。

使用free或者是cat /proc/meminfo可以查看当前系统的内存信息,包括总内存、已经使用内存以及可用内存信息

Linux和Windows不同的是Linux的图形界面只是它的一个程序,而不是必备组件。我们之前安装CentOS8.4选择的Server With GUI包含GNOME桌面的图形环境,我们可以使用init 3命令关闭图形,CentOS8会出现一个字符登录界面。

然后再使用free -h观察已经使用的内存只有334M,相比图形界面的730M 减少了接近400M内存,为了节省内存,生产环境一般不会安装和使用图形界面。

想要再切回图形界面使用init 5命令即可。

还可以使用runlevel命令查看当前系统运行的模式,其中输出结果的3表示之前是字符界面,5表示当前系统运行的是图形界面

使用lsblk命令可以查看磁盘信息,包括有几块磁盘以及每块磁盘的分区、容量信息

通过命令的执行结果可以得知目前CentOS8系统上有三块磁盘,分别是sda,sdb,sdc,其中sdb和sdc没有分区,

而sda磁盘是在安装系统时创建了四个分区,具体信息如下表格所示

除此以外还可以使用 cat /proc/partitions命令查看磁盘信息,从命令的执行结果可以看出容量还是以KB为单位。

通过arch命令可以查看当前系统架构为x86_64,这也是目前主流的系统架构。

不同的Linux发行版使用的Linux内核版本不同,通过uname -r可以查看Linux系统的内核版本

通过 cat /etc/os-release 命令或者是lsb_release -a命令可以查看操作系统的版本,后期在开发程序时不同的操作系统版本需要做不同的处理。

查看Ubuntu Server的版本

查看CentOS8的版本

CentOS还可以使用 cat /etc/redhat-release版本

Linux中的时间有系统时间和硬件时间两种

date和clock可以使用分号隔开后同时执行看系统时间和硬件时间

目前我的系统时间和硬件时间相差了18秒

如果硬件时间是准确的,那么就通过命令clock -s以硬件时间为准,同步校正系统时间。

如果系统时间是准确的,那么通过clock -w命令以系统时间为准,同步校正硬件时间

不同的国家在同一时刻所处的时间是不同的,因为时区不同。

例如中国就是东八区,东八区和格林威治的时区相比相差8个小时(也就是比北京时间慢了8个小时),之前在安装操作系统的时候设置的时区就是Asia/Shanghai,,通过timedatectl status查看当前时间状态,其中 Universal time就是格林威治时间,而Local Time就是系统设置时区(Asia/Shanghai)的时间,它们两者刚好相差了8个小时。 Time zone: Asia/Shanghai (CST, +0800) 表示当前的时区是亚洲上海。

如果现在你去了法国巴黎,可以通过timectl set-timezone 设置时区为欧洲巴黎,当修改时区后使用date命令查看系统时间显示的就是当前法国的巴黎时间,相比北京时间慢了6个小时。

修改时区最终影响的是 /etc/localtime文件

不过目前我在中国,因此还是改回亚洲上海

timedatectl list-timezones可以查看所有时区

cal命令可以查看当前月份的日历,例如今天是2021年10月5号

查看指定月份的日历

还可以查看指定年份的日历

生产环境不能随便关机和重启!!! 因为服务器基本都是 7*24 对外提供服务

测试环境或者是本地虚拟机安装的Linux服务器可以按需求关机或者重启

关机可以使用halt或者poweroff命令

而shutdown可以实现关机或者重启,shutdown -r表示重启,即reboot,shutdown -h表示关机,即halt。 -c表示取消关机或重启。

除此以外shutdown 还可以指定时间来关机或重启,默认是1分钟后执行。

关机和重启命令的常见用法

Linux下有nano和vim等文本编辑器,目前我们先使用nano来编辑文本。

如果系统上没有安装nano文本编辑器,那么在使用之前首先需要使用yum install -y nano命令来安装nano文本编辑器

在使用nano进行文本编辑时,nano后面跟文件路径即可打开文件,然后可以直接修改文件,类似于windows的记事本,修改完成后然后按Ctrl+x退出,接着按y保存修改,回车后退出nano。

然后使用nano /etc/motd来修改该文件,motd文件是用户登录之后提示的内容

然后输入Welcome to my class

之后按Ctrl+x退出nano编辑器,按y保存到文件汇中,然后按回车键确认修改。

再重新登录CentOS8.4

登录成功之后就会看到/etc/motd文件内容显示在终端上

我这里准备了一个motd文件,首先使用MobaXterm终端上传到/etc目录下覆盖现有的motd文件,在使用MobaXterm终端登录CentOS8.4-1后,首先将SSH Broswer的路径切换到/etc目录下

然后点击上传文件的按钮

选择提前准备好的motd文件上传到/etc目录下

然后再次重新登录系统就会看到一个大佛

大家可以自行访问 在线生成ASCII(图)艺术字,然后将内容复制到motd文件即可。

当我们登录Linux打开一个终端窗口,然后输入命令,用户与计算机的这种临时交互被称为一次会话(Session)、会话的一个重要的特点就是窗口与其中启动的进程是连接在一起的,打开窗口则会话开始,关闭窗口则会话结束,而且会话内部的进程也会随之而终止,不管有没有运行完成。

这里举一个例子,我们首先使用XShell远程登录CentOS8.4-1,然后使用ping 10.0.0.103命令检测是否能够连接10.0.0.103,也就是Ubuntu Server 20.04.3-1那台机器

命令执行的结果显示能够连接,而且只要你不关闭窗口会一直显示收到数据以及耗时。

然后我们复制一个会话

然后使用ps aux|grep ping 查看ping的进程信息,因为没有关闭会话窗口所以进程还在

当我们关闭之前开启的会话窗口之后

再次使用ps aux|grep ping查看进程会发现ping进程不存在了

为了解决上述的问题,我们就可以将会话与窗口解绑,也就是窗口关闭时会话并不会终止,而是继续运行,等到以后需要的时候,再让会话绑定其他窗口。

而终端复用器程序(例如screen,tmux)就是将会话与窗口的解绑工具,将它们彻底分离。

首次运行screen时会发现Shell提示command not found

我们需要使用yum install -y screen 来安装screen,但是执行之后发现提示错误:: Unable to find a match: screen

Centos8安装screen需要使用epel来安装,安装epel后,再安装screen,解决centos8无法安装screen的问题

然后再执行yum install -y screen 便可安装成功

Screen安装成功

在安装完screen后就可以使用了,首先在终端输入screen,然后你就会看到屏幕好像是刷新了一下,本质就是一个会话

然后再次运行ping 10.0.0.103

由于开启了screen,即使关闭了所有的会话窗口,你会发现使用ps aux |grep ping 命令查看ping命令的进程也还在。

如果后期在做运维工作,有些命令很耗时又怕误操作关闭会话导致命令的进程关闭就可以使用screen。

screen除了创建会话,能让命令关闭窗口后继续在后台执行的功能以外,还能够实现远程桌面共享,从而实现远程协助的功能。

实现该功能必须满足两个条件,两个用户必须使用同一个账号登录同一台机器。

例如这里小红和小明同时使用root账号登录了CentOS8.4,其中左边的窗口是小红,右边的窗口是小明

然后小红使用screen -S help开启一个远程会话,会话的名称叫help

然后小明使用screen -x help加入小红开启的会话

此时小明可以看到小红窗口的内容

当小明解决小红的问题后,可以使用ctrl a,d退出当前会话

如果小明不知道小红的会话名称,可以使用screen -ls获取当前会话

echo就是用于输出信息

echo输出固定字符串

echo输出变量值

echo输出转义字符

echo 默认可以实现换行

echo输出信息还可以带颜色

echo还可以清除屏幕,等价于clear命令或者是快捷键Ctrl+l


当前题目:linux绑核命令 linux进程绑核
网页链接:http://csdahua.cn/article/hjdhgj.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流