-
2021-05-26 04:46:52
一,背景
在服务器压力特别大,心跳经常丢失从而造成服务超时。经过分析发现网络没有问题,心跳网络包都发过来了而且也正常进入了dispatch队列,但是由于dispatch在处理别的request的时候耗时过长,而且要命的是它还hold着一把全局的锁,导致队列里面的其他queue也无法正常被dispatch。所以我们想到可以利用设置CPU亲和性来保证核心进程/线程得到足够的时间片,从而不让服务超时。
二,CPU隔离
说到亲和性,如果我们不隔离CPU,那么就只能减少CPU切换,提高cpu cache的命中率,从而减少内存访问损耗,提高程序的速度。但是这样做只能保证自己不被调度到的别的CPU,却不能阻止其他线程不来我这个CPU。这样就成了“我的是公共的,别人的我不能用!”,岂不是我得到的时间片更少了?所以为了防止这样的窘境,我们还得先“隔核”再“绑核”。
隔离CPU核心
我们可以用如下命令来查看自己的服务器有多少个核心:
[root@xt1 ~]# cat /proc/cpuinfo |grep "model name"
model name : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
model name : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
model name : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
model name : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
model name : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
model name : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
隔核方法: 修改grub
环境: CentOS7
具体步骤: (隔离4,5核心)
找到内核启动项,在其后面添加 “isolcpus=4,5”
linux16 /boot/vmlinuz-3.10.0-514.26.2.el7.x86_64 root=UUID=8c3205a6-2433-4799-8413-c74e4fe97f5c ro crashkernel=auto rhgb quiet LANG=en_US.UTF-8 systemd.debug isolcpus=4,5
reboot 重启服务器
检查启动项是否设置成功
[root@xt1 ~]# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.10.0-514.26.2.el7.x86_64 root=UUID=8c3205a6-2433-4799-8413-c74e4fe97f5c ro crashkernel=auto rhgb quiet LANG=en_US.UTF-8 systemd.debug isolcpus=4,5
检查隔离是否生效
// 如果设置成功,则落在该核心的线程会很少
ps -eLo pid,user,lwp,psr | awk '{if($4==4) print $0}' //检查核心4
ps -eLo pid,user,lwp,psr | awk '{if($4==5) print $0}' //检查核心5
// 也可以用top命令来查看
执行top,按数字1,就可以调出每个核心的使用状态,然后按下f按键,向下找到"P= Last Used Cpu (SMP)"这一行,按下回车,再按q按键返回,就可以看到每个线程具体落在哪个核心上面
top - 16:28:40 up 5 days, 22:03, 2 users, load average: 0.02, 0.08, 0.44
Tasks: 260 total, 2 running, 258 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
%Cpu1 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 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
%Cpu4 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu5 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7840224 total, 738160 free, 506176 used, 6595888 buff/cache
KiB Swap: 9727996 total, 9250224 free, 477772 used. 6992616 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND P
2894 root 20 0 51192 18928 2884 S 1.0 0.2 74:29.74 etcd 1
2836 root 20 0 1855044 50728 3296 S 0.7 0.6 25:13.31 ceph-osd 3
4648 root 20 0 146304 2200 1436 R 0.7 0.0 0:00.10 top 1
1813 root 20 0 554324 64492 9676 S 0.3 0.8 0:12.40 ceph-mds 1
3041 root 20 0 0 0 0 S 0.3 0.0 4:10.88 xfsaild/dm-8 1
3120 root 20 0 1818688 97464 2580 S 0.3 1.2 24:13.09 ceph-osd 2
30405 root 20 0 0 0 0 S 0.3 0.0 0:01.33 kworker/0:2 0
1 root 20 0 43476 2472 1340 S 0.0 0.0 0:30.26 systemd 3
三,sched_setaffinity/sched_getaffinity
更改一个进程的CPU affinity mask,可以设置一个进程在某个CPU核心上执行,也可以设置该进程在除了某CPU 核心之外的其他CPU核心上执行。如果第一个参数pid为0,则设置当前进程的mask。
其实这个mask是一个针对线程组内的线程属性,可以被独立调节。所以我们可以用gettid()的参数作为第一个参数,同样如果第一个参数为0,则设置当前线程。如果传的getpid的返回值,则设置该线程组的主线程mask属性。
int sched_setaffinity(pid_t pid, size_t cpusetsize,
cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize,
cpu_set_t *mask);
实验1
#include
#define __USE_GNU
#include
#include
#include
#include
void * fn(void *arg)
{
cpu_set_t set;
int i = 0;
CPU_ZERO(&set);
CPU_SET(1, &set);
printf("child thread is arriving .../n");
sched_setaffinity(0, sizeof(cpu_set_t), &set);
while (i<100000000)
{
i++;
if (i%5000 == 0)
{
printf ("i is %d\n", i);
sleep(1);
}
}
}
int main()
{
int isolated = 1;
pthread_t tid;
pthread_create(&tid, NULL, fn, NULL);
pthread_join(tid, NULL);
return 0;
}
四,pthread_setaffinity_np/pthread_getaffinity_np
更改一个线程的CPU affinity mask, 同样也是可以设置一个线程在某个CPU核心上执行,也可以设置该线程在除了某CPU 核心之外的其他CPU核心上执行。这两个接口在底层也是调用sched_setaffinity/sched_getaffinity。当第一个参数为0时,就是设置当前thread的mask。
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,
cpu_set_t *cpuset);
Compile and link with -pthread.
实验2
#include
#define __USE_GNU
#include
#include
#include
#include
void self_sleep()
{
int i = 0;
while (i<100000000)
{
i++;
if (i%5000 == 0)
{
printf ("i is %d\n", i);
sleep(1);
}
}
}
void * fn(void *arg)
{
cpu_set_t set;
pthread_attr_t tattr;
pthread_attr_init(&tattr);
CPU_ZERO(&set);
CPU_SET(1, &set);
printf("child thread is arriving .../n");
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &set);
self_sleep();
}
int main()
{
int isolated = 1;
pthread_t tid;
pthread_create(&tid, NULL, fn, NULL);
pthread_join(tid, NULL);
return 0;
}
五,属性继承
上面我们介绍了两种设置CPU affinity mask的接口,但是无论是哪一种接口有个共同的特性:创建出来的子线程默认会继承父亲线程的CPU affinity mask。在复杂的系统中有时并不希望这个属性的出现,因为可能会导致某个隔离出来的cpu上还是运行了很多的thread。所以我就想了一个解决方案来解决这个问题。
让所有的线程创建出来之后都跑在除了隔离出来的核心之外的其他核心上面,然后在单独为需要绑定核心的线程来设置CPU affinity mask
实验3
#include
#define __USE_GNU
#include
#include
#include
#include
void self_sleep()
{
int i = 0;
while (i<100000000)
{
i++;
if (i%5000 == 0)
{
printf ("i is %d\n", i);
sleep(1);
}
}
}
void * fn2(void *arg)
{
printf("child2 thread is arriving .../n");
self_sleep();
}
void * fn(void *arg)
{
int i, cpus;
cpu_set_t set;
pthread_t tid;
pthread_attr_t tattr;
pthread_attr_init(&tattr);
cpus = sysconf(_SC_NPROCESSORS_CONF);
printf("have %d cpus\n", cpus);
CPU_ZERO(&set);
for (i=0; i
{
if (i == 1)
continue;
CPU_SET(i, &set);
}
printf("child thread is arriving .../n");
printf("set child thread cpu to 0 .../n");
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &set);
pthread_create(&tid, NULL, fn2, NULL);
self_sleep();
pthread_join(tid, NULL);
}
int main()
{
int isolated = 1;
cpu_set_t set;
CPU_ZERO(&set);
CPU_SET(1, &set);
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &set);
pthread_t tid;
pthread_create(&tid, NULL, fn, NULL);
pthread_join(tid, NULL);
return 0;
}
参考文档
更多相关内容 -
affinity
2021-03-31 03:30:41亲和力 亲和力进步社区网络应用程序是一个社交网络,用于进步运动和计划及其追随者。 要求 您将需要安装和npm 。 如果您想做出贡献,那么您还需要进行github设置。 要运行数据库/应用程序服务器,您需要docker& 。... -
set_irq_affinity
2020-06-02 11:34:55/sbin/set_irq_affinity eth1 可以进行中断绑定指定的cpu,提高网卡收包效率 把下面“eth1” 修改成对应的网卡名称 irq=$(cat /proc/interrupts | grep eth1 | cut -d':' -f 1); echo $irq for i in $irq ; do sudo... -
DeepDTA_Deep Drug-Target Binding Affinity Prediction2018.pdf
2020-03-20 14:57:17The increase in the affinity data available in DT knowledge-bases allows the use of advanced learning techniques such as deep learning architectures in the prediction of binding affinities.... -
Affinity-Assets:补充Affinity Designer,Affinity Photo和Affinity Publisher软件的工具
2021-02-05 06:44:31Affinity-Assets:补充Affinity Designer,Affinity Photo和Affinity Publisher软件的工具 -
Java-Thread-Affinity:将Java线程绑定到给定的内核
2021-02-03 20:15:02Java-Thread-Affinity:将Java线程绑定到给定的内核 -
Affinity-crx插件
2021-04-02 10:16:31Affinity是一个Chrome扩展程序,可将您的新标签页转换为对他人友善的每日提醒! 将旧的无聊的新标签页变成“相似性”标签! 亲和力是一种超级简单的扩展程序,它使您每天可以进行基于文本的挑战,可以通过小手势... -
Affinity Photo Customer Beta.zip affinity-photo-beta: 1.8.2.174
2020-03-17 18:03:20无论是快速校正,精细修饰还是将自己沉浸在数百层的复杂美术中,Affinity Photo都能满足您的需求。 Affinity Photo已成为全球摄影和创意专业人士的首选,他们热爱它的速度,力量和精确度。它是与最新的强大计算机... -
AffinityPython:适用于Affinity的Python包装器(CRM平台)
2021-05-02 01:29:11Affinity Python包装器 Affinity的CRM平台的Python包装器。 包括针对其API的所有可用请求的功能以及其数据模型的OOD表示。 请参阅: : 班级 列表:电子表格的等效性。 它包含人员或组织(又名实体)的集合。 列表... -
Affinity Designer Beta.dmg affinity-designer-beta: 1.8.2.4
2020-03-14 15:18:00从最流畅,最快的照片编辑和图形设计软件到功能最强大的发布软件,Affinity应用程序都在推动创意技术的无限发展。 借助此突破性的创意软件,体验下一级的专业出版。 使用最快,最流畅和最精确的照片编辑器来创建... -
k8s通过virtual-kubelet部署带cinder后端动态pv的pod到openstack zun时报volume node affinity conflict
2021-01-07 06:21:251、环境信息 同 k8s+virtual-kubelet部署带动态pv的pod到openstack-zun 2、创建带cinder动态pv的pod 具体创建过程参考 k8s+virtual-kubelet部署带动态pv的pod到openstack-zun 3、pod创建失败 pod处于pending状态 ... -
对Gmail的亲和力「Affinity for Gmail」-crx插件
2021-03-21 09:34:51我们的Chrome扩展程序为Gmail提供了Affinity的所有功能,因此您无需离开收件箱即可管理自己的关系和商机 ★机会管理和跟踪交易,潜在客户,潜在客户,客户,候选人等。记笔记,跟踪提醒,并将与交易相关的文件保存在... -
Affinity Photo Customer Beta.zip affinity-photo-beta: 1.8.3.178 照片编辑软件
2020-03-30 12:38:40无论是快速校正,精细修饰还是将自己沉浸在数百层的复杂美术中,Affinity Photo都能满足您的需求。 受到专业人士的信赖 Affinity Photo已成为全球摄影和创意专业人士的首选,他们热爱它的速度,力量和精确度。它... -
Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields.docx
2020-09-10 11:08:59用知云文献翻译加上自己的一些理解翻译的Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields这篇论文 -
亲和力「Affinity」-crx插件
2021-03-09 04:26:31亲和力是一个Chrome扩展,它将你的新标签页转换成...Affinity的目标是通过重复鼓励社交活动来建立积极的行为习惯。 一次,Affinity使用您的浏览器在现实世界中重建同情和友爱。 毕竟,我们在一起! 支持语言:English -
Affinity-Propagation-Clustering-master.zip
2020-01-09 15:24:52仿射传播聚类(Affinity propagation clustering, AP)是在Science上提出的一种新聚类算法,参见:"Brendan J. Frey and Delbert Dueck. Clustering by Passing Messages Between Data Points. Science, 2007, 315... -
AI 相媲美的 Affinity Designer 1.9.2.1035 免注册版.zip
2021-04-02 14:46:11Affinity Designer是Serif提供的一种流行的矢量和栅格图形工具。 乍一看,这似乎只是另一个编辑器,只具有很少的用于普通绘图的功能(例如Paint),但这与实际情况相去甚远。该程序的工具库包含两个最受欢迎的Adobe... -
Java-Thread-Affinity,将Java线程绑定到给定的内核.zip
2019-09-25 06:14:40Java-Thread-Affinity,将Java线程绑定到给定的内核.zip -
【最新版】Affinity Designer Beta.dmg 1.8.3.2【亲测可用】最好的图形设计和插图应用程序
2020-04-07 23:41:56Affinity Designer确实改变了图形设计的世界。自发布以来,经过五年的深入改进,我们一直致力于实现功能强大,超流畅的应用程序的坚定信念,从而改善您的工作流程并发挥创造力。 只有您需要的所有工具都实现了您... -
Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields中文翻译
2020-09-10 09:37:49用知云文献翻译加上自己的一些理解翻译的Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields这篇论文 -
CKA考试习题:调度管理- nodeAffinity、podAffinity、Taints
2021-01-07 09:13:17CKA考试习题:调度管理- nodeAffinity、podAffinity、Taints CKA考试习题:K8S日志、监控与应用管理 CKA考试习题:网络管理-Pod网络、Ingress、DNS CKA考试习题:存储管理-普通卷、PV、PVC CKA考试习题:安全... -
Linux Kernel设置irq affinity选项的callback
2021-04-07 06:41:35dmesg 日志 -
AP近邻传播聚类算法(Affinity Propagation),matlab及python程序
2020-05-03 20:03:381.论文《Clustering by Passing Messages Between Data Points》 是AP算法的详细介绍,包括原理、优势、应用、展望等内容。 2.论文《基于近邻传播聚类和遗传优化的非侵入式负荷分解方法_徐青山》 ... -
Dense_Neighborhoods_on_Affinity_Graph.pdf
2019-05-31 10:23:37In this paper, we study the problem of how to reliably compute neighborhoods on affinity graphs. The k- nearest neighbors (kNN) is one of the most fundamental and simple methods widely used in many ... -
Affinity Designer v1.9.1.979 Portable.7z
2021-03-06 13:40:15Affinity Designer v1.9.1.979 Portable.7z -
Online Learning Affinity Measure with CovBoost for Multi-target Tracking
2021-02-11 11:18:36Online Learning Affinity Measure with CovBoost for Multi-target Tracking -
Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ∗ 源代码
2017-12-18 22:30:15Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ∗ 源代码 open pose 实时人体姿态估计 caffe+python+matlab -
Unsupervised Co-Segmentation of 3D Shapes via Affinity Aggregation Spectral Clustering
2021-02-10 13:53:07该论文提出了一种基于多特征融合的形状协同分割方法。 给定一组形状,我们的方法首先对这些形状作过分割成分割片,然后针对这些分割片,我们采用不同的特征描述符来对形状作度量。再通过对这些特征进行融合得到...