精华内容
下载资源
问答
  • 中断绑核: API_InterVectorConnect(SPI_GMAC, // 中断号 (PINT_SVR_ROUTINE)__emacIsr, (PVOID)pNetDev, "en...

    中断绑核:

        API_InterVectorConnect(SPI_GMAC,                    // 中断号
                               (PINT_SVR_ROUTINE)__emacIsr,
                               (PVOID)pNetDev,
                               "enet_isr");
        API_InterVectorEnable(SPI_GMAC);
    
        LW_CPU_ZERO(&cpuset);
        LW_CPU_SET(1, &cpuset);
        API_InterSetTarget(SPI_GMAC, sizeof(cpuset), &cpuset);              /*  默认中断绑 1 核             */
    

    线程绑核:

    #include <SylixOS.h>
    #include <pthread.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
                                                       //绑核操作
    PVOID tTest(PVOID pvArg)
    {
        while(1) {
            sleep(1);
        }
    
        return NULL;
    }
    
    
    int main(int argc, char **argv)
    {
        LW_CLASS_THREADATTR threadattr;
        LW_HANDLE           hThreadId;
        cpu_set_t           cpuset;
    
    
        Lw_ThreadAttr_Build(&threadattr,
                            4 * LW_CFG_KB_SIZE,
                            LW_PRIO_NORMAL,
                            LW_OPTION_THREAD_STK_CHK,
                            LW_NULL);
    
        hThreadId = Lw_Thread_Create("t_test", tTest, &threadattr, LW_NULL);
        if (hThreadId == LW_OBJECT_HANDLE_INVALID) {
            return (PX_ERROR);
        }
    
        CPU_ZERO(&cpuset);
        CPU_SET(2,&cpuset);                                                //设置为绑核为 2
        pthread_setaffinity_np(hThreadId,sizeof(cpu_set_t),&cpuset);       // 将线程绑定
    
        Lw_Thread_Join(hThreadId, LW_NULL);
        return 0;
    }
    

     

    展开全文
  • 如何查看当前中断绑核情况 static int __init proc_interrupts_init(void)  proc_create("interrupts", 0, NULL, &amp;proc_interrupts_operations);  /\  ...

    如何查看当前中断绑核情况

    static int __init proc_interrupts_init(void)
        proc_create("interrupts", 0, NULL, &proc_interrupts_operations);
                                                    /\
                                                    ||
                                                    \/
    static const struct file_operations proc_interrupts_operations = {
        .open        = interrupts_open,
        .read        = seq_read,
        .llseek        = seq_lseek,
        .release    = seq_release,
    };

    interrupts_open
        =>static int interrupts_open(struct inode *inode, struct file *filp)
            return seq_open(filp, &int_seq_ops);
                                    /\
                                    ||
                                    \/                                
                                    static const struct seq_operations int_seq_ops = {
                                        .start = int_seq_start,
                                        .next  = int_seq_next,
                                        .stop  = int_seq_stop,
                                        .show  = show_interrupts
                                    };
                                    
    int show_interrupts(struct seq_file *p, void *v)
        /* print header */
        if (i == 0) {
            seq_printf(p, "%*s", prec + 8, "");
            for_each_online_cpu(j)
                seq_printf(p, "CPU%-8d", j);
            seq_putc(p, '\n');
        }
        for_each_online_cpu(j)
            any_count |= kstat_irqs_cpu(i, j);
                =>unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
                    struct irq_desc *desc = irq_to_desc(irq);
                    return desc ? desc->kstat_irqs[cpu] : 0;
                    
                    
    中断绑核处理
    static int setup_affinity(unsigned int irq, struct irq_desc *desc)
        desc->chip->set_affinity(irq, desc->affinity);//mpic->hc_irq.set_affinity = mpic_set_affinity;
            =>int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask)//核心思想是公平从头开始分配
                struct mpic *mpic = mpic_from_irq(irq);
                unsigned int src = mpic_irq_to_hw(irq);
                if (mpic->flags & MPIC_SINGLE_DEST_CPU)
                    int cpuid = irq_choose_cpu(cpumask);
                        =>static int irq_choose_cpu(const cpumask_t *mask)
                            if (cpumask_equal(mask, cpu_all_mask))
                                /* Round-robin distribution... */
                            do_round_robin:
                                while (!cpu_online(irq_rover)) {
                                    if (++irq_rover >= NR_CPUS)
                                        irq_rover = 0;
                                }
                                cpuid = irq_rover;
                                do {
                                    if (++irq_rover >= NR_CPUS)
                                        irq_rover = 0;
                                } while (!cpu_online(irq_rover));
                            else {
                                cpuid = cpumask_first_and(mask, cpu_online_mask);
                                if (cpuid >= nr_cpu_ids)
                                    goto do_round_robin;
                            }
                            return get_hard_smp_processor_id(cpuid);
                    mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION), 1 << cpuid);//绑定哪个核则开哪个核的掩码
                
                
    一个关于Linux中断的问题:硬件处理,初始化和中断处理            
    http://www.elecfans.com/d/725543.html

    Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State
    https://www.cnblogs.com/LittleHann/p/4104598.html        

    Linux 中断详解
    https://blog.csdn.net/tiangwan2011/article/details/7891818

    ARM+Linux中断系统详细分析
    https://blog.csdn.net/luteresa/article/details/68061906

    ldd3学习之七:中断处理     博客好好学习
    http://blog.chinaunix.net/uid-24708340-id-3035617.html
                

    展开全文
  •  2、将ens33 的中断,绑定到cpu1上,需要先关闭系统自动绑核的动作。   再设置irq 19只亲和到cpu 2上。  可见,cpu0上的中断计数没有变化,一直是126,cpu1上的中断计数从4071增加到4074. 此时,查看irq...

    1、查看系统中断,以及中断的产生次数。/proc/interrupts 

     

     

     2、将ens33 的中断,绑定到cpu1上,需要先关闭系统自动绑核的动作。

      

           再设置irq 19只亲和到cpu 2上。

          

      可见,cpu0上的中断计数没有变化,一直是126,cpu1上的中断计数从4071增加到4074. 

          此时,查看irq 19的cpu 亲和值,如下:

          

     

        3、将ens33的中断,绑定到两个核上

      

     

    4、恢复cpu 核的自动调度。

         

     

        查看cpu 核的自动调度状态

      

     

     参考:

    https://blog.csdn.net/benpaobagzb/article/details/51044420

    转载于:https://www.cnblogs.com/zhouhaibing/p/9534875.html

    展开全文
  • y,… (代表将CPUx CPUy隔离),这样,init进程及后续进程的cpus_allowed就不包含这些隔离的CPU了,但是这些CPU仍然是active状态,也就是可以绑核,只是默认不用 (2)中断隔离 被隔离的CPU虽然没有线程run在上面,但是...

    一.启动流程

    Linux下CPU有4个状态:possible,present,online和active,分别对应__cpu_possible_mask,set_cpu_present,__cpu_online_mask和__cpu_active_mask 4个掩码

    这4个状态的意义可以查看:https://blog.csdn.net/liuhangtiant/article/details/84933156

    需要补充的是online状态和active的区别;某个核(这里的核指的是逻辑核,如果支持超线,比如8核16线程,此时就有16个逻辑核)在online状态下,只能说明这个核可以跑内核线程,但是不能不能跑用户线程,也就是说,此时SMP不会把用户线程调度到这个核上,通过taskset等绑核操作会报参数错误:

    taskset实际上会调用sched_setaffinity函数,taskset会把要绑定的核序号转换成mask,而真正绑定前,sched_setaffinity会检查这个mask是否是__cpu_active_mask4的子集,不是就返回-EINVAL,最终导致上图错误

    在online的基础上,如果核也处于active状态,此时SMP是可调度的,同时也可绑核。

    二.进程绑核

    1.绑核

    可在命令行中通过taskset绑定,也可以在程序中通过sched_setaffinity函数绑定;通过这种方式将某个进程绑定到某些核后,其实是限定了SMP对这几个进程的调度范围;单纯绑核而言,可以减少SMP对线程的核间移植,通常可以显著提升单线程性能,但是绑核通常是为了从宏观上对平台做算力均衡;但是其他进程也能用这些核。

    2.查看进程当前可以在哪些核上运行

    taskset -p <pid>命令会返回该进程的cpus_allowed数值,是一个掩码

    三.进程独占

    进程独占是在进程绑定基础上不让SMP把其他进程调度到这些独占的核上,另外也不让中断打扰这些核;主要分为三个步骤,可以参考:https://blog.csdn.net/weixin_30439067/article/details/95622518

    四.CPU状态监控

    1.sys接口

    在/sys目录下,eg.  tree /sys/bus/cpu/devices cpu0,可以看到比较详细的cpu信息

    2.top命令

    top主要是实时查看cpu负载和进程情况,top后按“1”,可以看到各个逻辑核占用情况,绑核和可以通过这种方式看效果:

    3.ps命令

    ps -ef可以查看父进程

    4.cat /proc/cpuinfo

    processor是逻辑核编号,core id是物理核编号

    5.设备树

    这是根文件系统下的设备树木描述文件,和真实设备树文件以及SOC 架构是对应的,可以看到有三个CPU集群,每个集群有两个物理核;这个信息主要是反映当前系统用到的物理核,实际上可能更多,比如下图只用到6个核,但实际有8个核

    6.lscpu

    主要显示CPU的固有信息,关键字段

    Thread(s) per core:  2                     :支持超线程,每个核对应两个逻辑核

    Byte Order:          Little Endian        :小端模式

    CPU op-mode(s):      32-bit, 64-bit  :支持32位和64位

    On-line CPU(s) list: 0-15                  :对应cpu_online_mask,说明16个逻辑核都是online状态

     

    五.CPU状态配置

    1.通过sys接口进行online状态使能

    eg.  sudo echo "0" > /sys/bus/cpu/devices/cpu0/online ,这条命令让cpu0退出online状态;

    默认都开启:

    执行这条命令后:

    2.设置内核启动参数

    (1)CPU隔离

    上文配置“进程独占”中,/ boot/grub/grub.conf的kernel列最末尾加上isolcpus=x,y,… (代表将CPUx CPUy隔离),这样,init进程及后续进程的cpus_allowed就不包含这些隔离的CPU了,但是这些CPU仍然是active状态,也就是可以绑核,只是默认不用

    (2)中断隔离

    被隔离的CPU虽然没有线程run在上面,但是仍会收到interrupt.

    Interrupt request是硬件级别的服务请求.详情见附录,此处不表.我们需要知道的是IRQ有一个亲和度属性smp_affinity. smp_affinity决定允许哪些CPU核心处理IRQ.

    在redhat(其它发行版未知)中,某一特定IRQ的亲和度值储存在/proc/irq/IRP_NUMBER/smp_affinity文件中.此文件仅ROOT用户可见.储存的值是一个十六进制位掩码(hexadecimal bit-mask),代表着系统的所有CPU核心.

    命令cat /proc/interrupts可以看到所有设备的interrupts信息,第一列即为IRP_NUMBER.

    命令cat /proc/irq/32/smp_affinity可以看到IRQ号为32的亲和度.默认值为f,代表这个IRP能被所有CPU接受处理.

    命令echo 1 >/proc/irq/32/smp_affinity把IRQ号为32的亲和度值设为1,代表这个IRP仅能被CPU0接受处理

    照此,我们可以据要求任意绑定IRQ到CPU

    虽然我们已经做了很大努力,但是仍有一部分中断没有被绑定,例如: Single function call interrupts, Local timer interrupts等等

    3.配置内核

    比如在menuconfig中配置后从新编译内核

     

     

    展开全文
  • 如何实现绑定进程到指定上?如何实现绑定某个中断到指定上? 待完善。 转载于:https://www.cnblogs.com/zhouhaibing/p/7668788.html
  • Linux性能优化——中断绑定

    千次阅读 2018-12-30 21:44:15
    中断绑定 对于实时环境,我们需要消除或者最小化事件响应的延迟。要想做到这一点,需要将不同的中断响应(IRQs)和用户进程绑定到不同的CPU核心上,使他们彼此隔离。 为什么需要这样呢? 默认情况下,Linux的中断...
  • 1.在系统结构中,CPU工作的模式有两种,一种是中断,由各种设备发起;一种是轮询,由CPU主动发起。所有的linux操作系统都是基于中断驱动的。当我们在键盘上按下一个按键时,键盘就会对CPU说,一个键已经被按下。在...
  • 1. 概述 本篇主要介绍在Zynq平台编写中断相关的驱动...私有中断是多核CPU上特有的中断,私有中断只能被其所有者核心获取和响应,不会被其他发现。常见的私有中断有全局定时器,私有看门狗定时器,私有定时器等...
  • #####编辑器依旧那么难用 难用 难用~~##########...CPU亲缘性及网卡中断绑定 每个CPU的每个核心都会被识别成一个逻辑CPU,由一个核心会存在超线程的功能,所以一个物理核心会表现成为多个cpu 多个cpu之间是如何通信...
  • 网卡多队列及中断绑定

    万次阅读 2013-11-03 21:20:08
    最初是用来解决网络IO QoS (quality of service)问题的,后来随着网络IO的带宽的不断提升,单核CPU不能完全处满足网卡的需求,通过多队列网卡驱动的支持,将各个队列通过中断绑定到不同的上,以满足网卡的需求。...
  • 描述: 想采用PowerPC的T4240开发一款数据转发模块,数据量大小不一小到几KB大到MB。...有个想法是将小包数据的中断绑定到固定的核心上去,大包数据绑定到其他核心。 目前无法量化测试,请问有什么好的方法或思路?
  • Linux 线程绑核

    2012-02-15 21:17:00
    假设业务模型中耗费cpu的分四种类型,(1)网卡中断(2)1个处理网络收发包进程(3)耗费cpu的n个worker进程(4)其他不太耗费cpu的进程 基于1中的 负载均衡是针对进程数,那么(1)(2)大部分时间会出现在cpu0上,(3)的n个...
  • 假设业务模型中耗费cpu的分四种类型,(1)网卡中断(2)1个处理网络收发包进程(3)耗费cpu的n个worker进程(4)其他不太耗费cpu的进程 ...当发生网卡中断的时候,cpu被打断了,处理网卡中断,那么分配...
  • 中断处理函数会在一个CPU上运行,如果绑定了一个就在绑定的上运行。) 硬中断处理函数通过构建sk_buff,把frame从网卡FIFO拷贝到内存skb中,接下来交给内核处理(调用软中断)。因为网卡上接收网络数据包的...
  • 中断测试

    2018-06-01 07:45:42
    1)假设系统有N个,创建N个线程,分别绑定到0...(N-1);2)所有线程通过同一个互斥锁[FIFO方式唤醒]进行阻塞和唤醒操作,并对自己被唤醒计数;3)间随机唤醒;执行一段时间,至少N分钟#include "testfrmw...
  • 1.应用场景在一些情况下,对于一些紧急的中断任务,系统需要为其提供稳定可靠的中断响应时间,但一般的中断服务...2.对于多核处理器,可以采用中断绑核的形式,即将紧急中断绑定到某一核上,该核只处理紧急任务。...
  • Android O 绑定SurfaceFlinger到大

    千次阅读 2018-08-01 19:19:13
    目前的平台是big.LITTLE 架构,遇到一个卡顿问题,怀疑和小中断过于频繁有关,所以想把SF绑定到大看看 首先top获取SurfaceFlinger的pid 707 system -2 -20 98M 24M 6.8M S 17.0 0.4 541:00.94 ...
  • Linux 线程绑核 假设业务模型中耗费cpu的分四种类型,(1)网卡中断(2)1个处理网络收发包进程(3)耗费cpu的n个worker进程(4)其他不太耗费cpu的进程 基于1中的 负载均衡是针对进程数,那么(1)(2)大部分时间会出现在cpu...
  • 网卡软中断进行了绑核。设备具备80个核,960个网卡中断,没开启bbr,全部是tcp呼叫。 # cat /proc/cpuinfo |grep processor|wc -l 80 # cat /proc/interrupts |grep eth |wc -l 960 ...
  •   在上一篇博客中介绍了软中断,软中断可以用于ZYNQ的两个CPU之间进行中断,一次来进行两个CPU之间的通信,在ZYNQ的架构中,PL端也能够向PS端提供中断,PL端向PS端的中断一共有16个。   可以看到PL端的中断,...
  • 函数绑定核中断,查看相关文档知道-DUSE_AMP=1的作用是: CPU0先启动运行初始化系统,然后启动CPU1,这时CPU0已经初始化共享资源并且可能正在使用某些资源。但是CPU0和CPU1的工程使用的Bsp的源码是一样的,增加“-...
  • 特此声明:转载需要说明且附上本人链接! cpu通过硬中断获取硬件事件。每一个网卡的队列都会有一...但是这个irqbalance并不好,会有中断间流动(不可控)和有时分配不均的情况(irqbalance的策略可能不是很好),使得
  •   对于多核的CPU,经常会出现一个的利用率...通过查看中断处理情况,可以发现该处理的中断数目过多导致。   查询命令:   cat /proc/interrupts 26: 351416232 351355635 351336252 351305610 PCI

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

中断绑核