首页
学习
活动
专区
工具
TVP
发布

一文搞懂 什么是CPU上下文?为什么要切换?如何减少切换?

我们可以手动地为其分配CPU核,而不会过多的占用同一个CPU,所以设置CPU亲和可以使某些程序提高性能。 CPU亲缘可以分为两大类:软亲缘和硬亲缘。...Linux 内核进程调度器天生就具有被称为 CPU亲缘(soft affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。...CPU亲缘是指通过Linux提供的相关CPU亲缘设置接口,显示的指定某个进程固定的某个处理器上运行。本文所提到的CPU亲缘主要是指硬亲缘。...Linux CPU亲缘的使用 我们有两种办法指定程序运行的CPU亲缘。 通过Linux提供的taskset工具指定进程运行的CPU。...方式二,glibc本身也为我们提供了这样的接口,借来的内容主要为大家讲解如何通过编程的方式设置进程的CPU亲缘

1.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

Redis高负载下的中断优化

中断亲缘设置 通过设置中断亲缘,可以让指定的中断向量号更倾向于发送给指定的CPU Core来处理,俗称“绑核”。...例如下图中,将16进制的400转换成2进制后,为 10000000000,“1”在第10位上,表示亲缘是第10个CPU Core。 ? 那为什么中断号只设置一个CPU Core呢?...容易想到,由最初的CPU 0单核处理中断,改进到多核处理中断,Redis进程被中断影响的几率增大了,因此我们需要对Redis进程也设置CPU亲缘,使其与处理中断的Core互相错开,避免受到影响。...使用命令taskset可以为进程设置CPU亲缘,操作十分简单,一句taskset -cp cpu-list pid即可完成绑定。...经过一番压测,我们发现使用8个core处理中断时,流量直至打满双万兆网卡也不会出现丢包,因此决定将中断的亲缘设置为物理机上前8个core,Redis进程的亲缘设置为剩下的所有core。

2.9K110

Linux】多进程高并发设计框架示例

多进程高并发设计框架 建议根据cpu核心数量来设置子进程的数量。 建议将对应某一进程绑定到某一cpu上。(cpu亲缘) 优点: 充分利用多核系统的并发处理能力。...示例: multip_process.c #define _GNU_SOURCE #include #include #include #include...cpu亲缘关系,将进程绑定在其中的一个核上 static void worker_process_init(int worker){ cpu_set_t cpu_affinity; //多核高并发处理...ps -eLo ruser,pid,lwp,psr,args 设置CPU亲缘后,可以发现每个子进程对应一个核心。...若不设置,则存在进程与核心之间的切换,进程从一个核切换到另一个核,进行拷贝与复制,从而浪费了CPU的性能,降低了执行效率。 typedef函数指针相关文章——对于函数指针和typedef的结合运用

58120

进程、线程和协程之间的区别和联系

文章目录 一、进程 二、线程 三、进程和线程的区别与联系 四、一个形象的例子解释进程和线程的区别 五、进程/线程之间的亲缘 六、协程 一、进程 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体...五、进程/线程之间的亲缘 亲缘的意思是进程/线程只在某个cpu上运行(多核系统),比如: BOOL WINAPI SetProcessAffinityMask( _In_ HANDLE...代表只在 cpu0 或 cpu1上工作; */ 使用CPU亲缘的好处:设置CPU亲缘是为了防止进程/线程在CPU的核上频繁切换,从而避免因切换带来的CPU的L1/L2 cache失效,cache失效会降低程序的性能...子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了CC执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。...blog.csdn.net/tennysonsky/article/details/46046317 https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000

29430

UNIX(进程间通信):06 深入理解进程,线程和协程

上下文切换:在某一时刻,一核CPU只能执行一个进程。相当于内核只能让一核CPU为一个机器人提供驱动力让它动起来(1:1),多核CPU可以同时为多个机器人提供驱动力。...CPU时间片。...五、进程/线程之间的亲缘   亲缘的意思是进程/线程只在某个cpu上运行(多核系统),比如: BOOL WINAPI SetProcessAffinityMask( _In_ HANDLE...代表只在 cpu0 或 cpu1上工作; */   使用CPU亲缘的好处:设置CPU亲缘是为了防止进程/线程在CPU的核上频繁切换,从而避免因切换带来的CPU的L1/L2 cache失效,cache...子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了CC执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。

41810

nginx+php-fpm故障排查

小明初到一家公司做运维的工作,刚来的第一天就开始部署LNMP(Linux+Nginx+MySQL+PHP)环境,结果出现了问题。 他来向我请教。...具体问题现象、原因和解决思路如下: 问题一 nginx进程CPU和内存不均衡,某个进程占用资源特别高,如何解决?...回答:我让小明绑定下CPU亲缘(设置nginx配置worker_cpu_affinity项为auto,auto这个特殊值(1.9.10版本)允许自动绑定工作进程到可用的CPU上。)...,绑定后CPU和内存使用就均衡了。 问题二 小明又问close系统调用消耗很高怎么解决? 回答:且听我娓娓道来,继续看下文。 $ strace -cp $(pgrep -n nginx) ?...系统32c的,top查看负载去到75.14, 查看过nginx和php-fpm的 错误日志也没有什么发现。

2.1K10

实时操作系统

一般的linux都是GPOS(通用)内核。GPOS是不保证实时的,但是对于大多数应用程序来说是没有问题的。GPOS可以充分利用物理资源。但在实时性要求比较高的场景需要使用实时内核,RT内核。...但是在实时系统中会导致中断自动漂移,对性能造成不稳定因素,在高性能的场合建议关闭并设置IRQs的CPU亲和设置IRQs的CPU亲和 1..../ } /* ... */ } 从程序的主循环可以很清楚的看到它的逻辑,在退出之前每隔10秒它做了以下的几个事情: 清除统计 分析中断的情况 分析中断的负载情况 根据负载情况计算如何平衡中断 实施中断亲缘变更...实施中断亲缘变更 echo MASK > /proc/irq/N/smp_affinity 测试 测试工具 Cyclictest是rt-tests 下使用最广泛的测试工具,一般主要用来测试使用内核的延迟...判断标准:延迟响应时间(us) 测试方法 对GPOS和RTOS分别执行下面的命令: # taskset -c 2 stress --cpu 1 --io 1 -d 1 # taskset -c 2 cyclictest

2.2K90

【鹅厂网事】高性能网关设备及服务实践

那么,我们怎样才能让程序能在多个CPU核心上平行扩展:尽量让每个核维护独立数据结构;使用原子操作来避免冲突;使用无锁数据结构避免线程间相互等待;设置CPU亲缘,将操作系统和应用进程绑定到特定的内核上,...EAL实现了DPDK运行的初始化工作,基于大页表的内存分配,多核亲缘设置,原子和锁操作,并将PCI设备地址映射到用户空间,方便应用程序访问。...在CPU亲缘设置方面,将Linux运行在单独的内核上,实际的数据收发包或者处理逻辑绑定在单独的内核上,避免进程间竞争和上下文切换。...亲缘设置方面,在一台双CPU的12颗物理核的机器上,因为开启了超线程,逻辑核实际是24个,但由于两颗CPU之间的通信需要使用QPI,会增大报文处理时延。...图13 一种UDP服务程序的亲缘设置方案 另外自己来处理数据包,从以太网数据帧开始向上层协议分析,并进行必要的校验,只过滤出需要处理的UDP报文,不去使用复杂且低效的Linux协议栈来处理报文。

88510

windows 线程

然后运行调度程序,调度下一个线程,所以说线程休眠的时间理论上最少也有20ms,通常会比我们设置的时间长。...线程的亲缘 线程的亲缘与进程的相似,但是线程的亲缘只能在进程亲缘的子集之上,比如进程的亲缘设置在0 2 3 8这几个CPU上,线程就只能在这几个CPU上运行即使设置亲缘为7,系统也不会将线程加载到这个...调用函数SetThreadAffinityMask可以设置亲缘,使所有线程都在不同的CPU上运行,已达到真正的并发执行。...下面是一个使用亲缘的例子: //设置CPU的位掩码 #define SETCPUMASK(i) (1<<(i)) DWORD WINAPI ThreadProc(LPVOID lpParam); #define...//死循环 FOREVER } 上述程序首先判断了CPU核数,然后有几个CPU就创建几个线程,通过亲缘设置为每个CPU绑定一个线程,在线程中我们什么都不做,只是一个死循环,主要是为了耗干

1.6K20

高性能网关设备及服务实践

那么,我们怎样才能让程序能在多个CPU核心上平行扩展:尽量让每个核维护独立数据结构;使用原子操作来避免冲突;使用无锁数据结构避免线程间相互等待;设置CPU亲缘,将操作系统和应用进程绑定到特定的内核上,...EAL实现了DPDK运行的初始化工作,基于大页表的内存分配,多核亲缘设置,原子和锁操作,并将PCI设备地址映射到用户空间,方便应用程序访问。...在CPU亲缘设置方面,将Linux运行在单独的内核上,实际的数据收发包或者处理逻辑绑定在单独的内核上,避免进程间竞争和上下文切换。...亲缘设置方面,在一台双CPU的12颗物理核的机器上,因为开启了超线程,逻辑核实际是24个,但由于两颗CPU之间的通信需要使用QPI,会增大报文处理时延。...图13 一种UDP服务程序的亲缘设置方案 另外自己来处理数据包,从以太网数据帧开始向上层协议分析,并进行必要的校验,只过滤出需要处理的UDP报文,不去使用复杂且低效的Linux协议栈来处理报文。

3.3K94

Linux环境使用crontab命令设置定时周期执行任务【含php执行代码】

本文实例讲述了Linux环境使用crontab命令设置定时周期执行任务。分享给大家供大家参考,具体如下: 从linux帮助中查看crontab命令有以下参数: ?...查看定时器 -r:删除定时器(从/var/spool/cron目录中删除某个用户的crontab文件,默认删除当前用户的) -i:删除定时器(删除之前给出确认提示) 使用场景1: 执行一些周期统计的业务操作...php $log = "/var/www/html/log.txt";//日志文件(注意设置可写入权限) $url = 'http://yz.chsi.com.cn/'; //要监听的网址...设置定时任务,这里盗了一张网上的图(crontab格式说明): ?...crontab -e //执行周期 php安装路径 执行的php文件(注意设置可执行权限) 例如: 5 0 * * * /usr/bin/php /var/www/html/jianting.php

98431

workerman如何通过reusePort解决Linux内核进程惊群问题?

结论:如果你的 Linux 内核版本是 3.9 及以上的话,那么在使用 Workerman 时,可以将 reusePort 设置为 true 提升程序运行效率。...workerman 如何利用 reuseport 虽然你只要在 workerman 中把 reusePort 设置为 true,就能享受到 Linux 的这个高级特性。...当业务足够简单时,参与处理请求的进程数越趋近于cpu核心数服务器吞吐量越高。 例如4核服务器,进程数设置为4时,helloworld压测QPS一般是最高的。...如果参与处理的进程数超过cpu核数太多,进程上下文开销越大,性能反而越差。而一般带数据库业务时,进程数设置cpu核数的3倍-6倍性能可能会更好。...requests-concentrated-in-certain-processes.html Workerman的reusePort属性详解:https://www.jianshu.com/p/97cc8c52d47a

14110

windows 多任务与进程

进程的亲缘 进程或者线程只在某些CPU上被执行,而不是由系统随机分配到任何可用的CPU上,这个就是进程的亲缘。...例如某个CPU有8个处理器,可以通过进程的亲缘设置让该进程的线程只在某两个处理器上运行,这样就不会像之前那样在8个CPU中的任意几个上运行。...,这个时候即使将这个线程又分配到5号处理器上,也能访问这个公共存储区,所以再设置线程在固定的处理器上运行就显得有些鸡肋,这也是拥有三级缓存的CPU比二级缓存的CPU占优势的地方。...但是如果CPU只具有二级缓存,通过设置亲缘可以发挥高速缓存的优势,提高效率。 亲缘可以通过函数SetProcessAffinityMask设置。...为了设置亲缘,首先应该了解机器上CPU的情况,根据实际情况来妥善安排,获取CPU的详细信息可以通过函数GetLogicalProcessInformation来完成。

1.1K40

Goroutine就是协程:进程 线程 协程 各自的概念以及三者的对比分析

特点 操作系统会以进程为单位,分配系统资源(CPU时间片,内存等资源),进程是资源分配的最小单位。...示意图 2 线程 概念 线程,有时被称为轻量级进程(LightWeight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。...这些车道(线程)的运行和交通灯(代码逻辑)息息相关,如果交通灯出现问题(代码逻辑问题,比如死锁,多个线程同时竞争同一资源),会造成交通混乱 这些车道(线程)谁先运行起来是未知的,只有当信号灯变化(分配CPU...5 进程/线程之间的亲缘 概念 亲缘的意思是进程/线程只在某个CPU上运行(多核系统) 好处 使用CPU亲缘的好处:防止进程/线程在CPU的多核间频繁切换,从而避免因切换带来的CPU的L1/L2...在所有语言中都是层级调用的,A调用B,B调用CC执行完毕返回,B执行完毕返回,最终A执行完毕 由此可见,子程序调用是通过栈实现的,一个线程就是执行一个子程序。

51110

Python自动化运维学习笔记

使用情况 cpu = psutil.cpu_stats() printcpu.interrupts,cpu.ctx_switches   psutil.cpu_times(percpu=True)      ...# 输出每个核心的详细CPU信息 psutil.cpu_times().user              # 获取CPU的单项数据 [用户态CPU的数据] psutil.cpu_count()                   ...时间,包括用户态、内核态】 p.cpu_affinity()  # 显示CPU亲缘关系 p.memory_percent()   进程内存利用率 p.meminfo()   进程的RSS、VMS信息 p.io_counters...类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的执行情况 import psutil from subprocess import PIPE p =psutil.Popen(["/usr/bin/python" ,"-c"...()    # 显示当前登录的用户,和Linux的who命令差不多   # 获取开机时间 psutil.boot_time() 结果是个UNIX时间戳,下面我们来转换它为标准时间格式,如下: datetime.datetime.fromtimestamp

41240

记录一个多核CPU负载不均衡问题

| sort | uniq -c 157 0 34 1 34 2 32 3 可见分配给 CPU0 的 PHP-FPM 进程比其他三个 CPUx 总和还要多。...问题总要解决,既然 PHP-FPM 没有类似 Nginx 那样 CPU 亲缘(affinity)绑定的指令,那么我们可以使用 taskset 绑定 PHP-FPM 进程到固定的 CPUx 来解决问题:.../bin/bash CPUs=$(grep -c processor /proc/cpuinfo) PIDs=$(ps aux | grep "php-fpm[:] pool" | awk '{print...0.00 1.71 0.00 0.00 0.00 ... 82.35 终于平均了,不过需要提醒的是,一旦 PHP-FPM 处理的请求数超过 max_requests 的设置...,那么对应的进程将自动重启,先前的 taskset 设置也将失效,所以为了一直有效,我们需要把 taskset 脚本添加到 CRON 配置中去,例如每分钟自动设置一遍!

1.1K20
领券