精华内容
下载资源
问答
  • 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...
  • The 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软件的工具
  • Java-Thread-Affinity:将Java线程绑定到给定的内核
  • Affinity-crx插件

    2021-04-02 10:16:31
    Affinity是一个Chrome扩展程序,可将您的新标签页转换为对他人友善的每日提醒! 将旧的无聊的新标签页变成“相似性”标签! 亲和力是一种超级简单的扩展程序,它使您每天可以进行基于文本的挑战,可以通过小手势...
  • 无论是快速校正,精细修饰还是将自己沉浸在数百层的复杂美术中,Affinity Photo都能满足您的需求。 Affinity Photo已成为全球摄影和创意专业人士的首选,他们热爱它的速度,力量和精确度。它是与最新的强大计算机...
  • Affinity Python包装器 Affinity的CRM平台的Python包装器。 包括针对其API的所有可用请求的功能以及其数据模型的OOD表示。 请参阅: : 班级 列表:电子表格的等效性。 它包含人员或组织(又名实体)的集合。 列表...
  • 从最流畅,最快的照片编辑和图形设计软件到功能最强大的发布软件,Affinity应用程序都在推动创意技术的无限发展。 借助此突破性的创意软件,体验下一级的专业出版。 使用最快,最流畅和最精确的照片编辑器来创建...
  • 1、环境信息 同 k8s+virtual-kubelet部署带动态pv的pod到openstack-zun 2、创建带cinder动态pv的pod 具体创建过程参考 k8s+virtual-kubelet部署带动态pv的pod到openstack-zun 3、pod创建失败 pod处于pending状态 ...
  • 我们的Chrome扩展程序为Gmail提供了Affinity的所有功能,因此您无需离开收件箱即可管理自己的关系和商机 ★机会管理和跟踪交易,潜在客户,潜在客户,客户,候选人等。记笔记,跟踪提醒,并将与交易相关的文件保存在...
  • 无论是快速校正,精细修饰还是将自己沉浸在数百层的复杂美术中,Affinity Photo都能满足您的需求。 受到专业人士的信赖 Affinity Photo已成为全球摄影和创意专业人士的首选,他们热爱它的速度,力量和精确度。它...
  • 用知云文献翻译加上自己的一些理解翻译的Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields这篇论文
  • 亲和力是一个Chrome扩展,它将你的新标签页转换成...Affinity的目标是通过重复鼓励社交活动来建立积极的行为习惯。 一次,Affinity使用您的浏览器在现实世界中重建同情和友爱。 毕竟,我们在一起! 支持语言:English
  • 仿射传播聚类(Affinity propagation clustering, AP)是在Science上提出的一种新聚类算法,参见:"Brendan J. Frey and Delbert Dueck. Clustering by Passing Messages Between Data Points. Science, 2007, 315...
  • Affinity Designer是Serif提供的一种流行的矢量和栅格图形工具。 乍一看,这似乎只是另一个编辑器,只具有很少的用于普通绘图的功能(例如Paint),但这与实际情况相去甚远。该程序的工具库包含两个最受欢迎的Adobe...
  • Java-Thread-Affinity,将Java线程绑定到给定的内核.zip
  • Affinity Designer确实改变了图形设计的世界。自发布以来,经过五年的深入改进,我们一直致力于实现功能强大,超流畅的应用程序的坚定信念,从而改善您的工作流程并发挥创造力。 只有您需要的所有工具都实现了您...
  • 用知云文献翻译加上自己的一些理解翻译的Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields这篇论文
  • CKA考试习题:调度管理- nodeAffinity、podAffinity、Taints CKA考试习题:K8S日志、监控与应用管理 CKA考试习题:网络管理-Pod网络、Ingress、DNS CKA考试习题:存储管理-普通卷、PV、PVC CKA考试习题:安全...
  • dmesg 日志
  • 1.论文《Clustering by Passing Messages Between Data Points》 是AP算法的详细介绍,包括原理、优势、应用、展望等内容。 2.论文《基于近邻传播聚类和遗传优化的非侵入式负荷分解方法_徐青山》 ...
  • In 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
  • Online Learning Affinity Measure with CovBoost for Multi-target Tracking
  • Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ∗ 源代码 open pose 实时人体姿态估计 caffe+python+matlab
  • 该论文提出了一种基于多特征融合的形状协同分割方法。 给定一组形状,我们的方法首先对这些形状作过分割成分割片,然后针对这些分割片,我们采用不同的特征描述符来对形状作度量。再通过对这些特征进行融合得到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,455
精华内容 16,582
关键字:

affinity

友情链接: templates v8.zip