news 2026/10/20 14:32:56

Linux与实时控制如何兼得?三种方案选型与延迟优化实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux与实时控制如何兼得?三种方案选型与延迟优化实践

前阵子朋友的项目做方案评审,甲方提了一个很典型的要求:控制器既要跑视觉检测、网络上报、人机界面这些Linux生态的东西,又要保证伺服位置环的响应延迟控制在1毫秒以内,而且不允许偶发超时。会议室里做软件的同事说Linux没问题,做控制的同事说必须上RTOS,两边一度吵到拍桌子。其实这个命题就是题目这句话——Linux与实时控制如何兼得。答案是能,但前提是先把两件事想清楚:你的“实时”到底是多硬的指标,以及你愿意在哪一层做改造。

这篇博文会从原理、选型、核心参数到实操排查一步步展开,适合正在做机器人、运动控制、工业控制器、自动化设备的工程师,也适合想验证“产线能不能用Linux”的团队参考。我会尽量少讲空话,多给可以直接抄作业的命令、代码和避坑经验。

1. 为什么Linux“天生”不适合实时控制

1.1 分时调度和硬实时之间的差距

Linux默认是一个分时操作系统,它的调度器追求的是“公平”和“吞吐量”。最常见的CFS调度器会把CPU时间按照优先级和权重分给所有任务,尽量让每个进程都获得合理的运行机会。你可以把它理解成食堂打饭:每个窗口按顺序来,一个人吃几口就换下一个人,这样排队的人都能吃上饭,整体效率不错,但没有人能保证某个窗口在指定的10秒内一定打到你爱吃的菜。

实时控制要的是完全相反的逻辑:要求某个任务在固定周期内“必须”完成,哪怕其他任务全部让路。这更像急诊室,救护车到了,其他排队的人都要往后靠,医生必须在一个明确的时间窗内开始处理。

所以实时系统关注的核心指标不是“平均延迟”有多低,而是“最坏情况延迟”有没有上界。一个控制循环平均10微秒跑完没用,只要在某一次跑到10毫秒,机械臂就可能撞上夹具,电机电流就可能失控,整条产线就得停下来。

1.2 延迟到底从哪来的

不把延迟来源弄清楚,后面做任何优化都是瞎调。Linux下一个实时任务从“就绪”到“真正执行”,会经历好几个关卡。

第一关是进程调度延迟。普通任务用的是分时调度,没有严格优先级的概念,低优先级任务和高优先级任务几乎平等竞争。一个实时任务想在毫秒级响应,就必须切换成实时调度策略并设置足够高的优先级。

第二关是内核抢占延迟。用户态进程执行系统调用时进入了内核态,而普通内核里有很多不可抢占的区域,比如持有自旋锁的临界区、关闭了本地中断的代码段。实时任务优先级再高,遇到这种情况也只能等内核把这段代码跑完。这段临界区可能只有几微秒,也可能因为有竞争而拖到几十甚至几百微秒。

第三关是中断处理延迟。网卡、磁盘、定时器产生的中断会抢占一切。默认情况下中断处理程序优先级最高,一个普通的网络包中断也可能打断实时任务。这也是为什么很多实时方案里要把中断绑到非实时核上。

第四关是缺页错误和缓存抖动。实时任务访问一段还没加载到物理内存的数据时,会触发缺页异常,内核要从磁盘或闪存读数据进来。一次磁盘读可能几百微秒甚至毫秒级,这对硬实时是致命的。另外多核架构下,其他核频繁读写同一片缓存区域,也会让实时任务经历大量缓存未命中,执行时间成倍拉长。

1.3 现实中的“实时”分很多档

在谈方案之前,必须先定义需求。不同应用对实时性的要求差得非常远,我习惯把它分三档:

  • 硬实时,微秒级。典型是伺服电流环、变频器控制、高精度信号采集。这类场景延迟上界往往要求1到10微秒,普通Linux再优化也很难做到。
  • 准硬实时,百微秒到毫秒级。典型是运动控制的位置环/速度环、工业总线主站(比如EtherCAT的周期同步)、机器人关节控制。这类场景Linux经过改造后是可行的。
  • 软实时,毫秒到几十毫秒级。典型是音视频采集、数据记录、进程监控。偶发超时可接受,只要整体流畅就行。

下面这个表可以帮你快速对照:

应用场景典型控制周期实时等级Linux改造后是否够用
伺服电流环50~100微秒硬实时基本不够,建议异构方案
运动控制位置环0.5~2毫秒准硬实时PREEMPT_RT或Xenomai可行
工业总线主站125微秒~2毫秒准硬实时Xenomai更稳,PREEMPT_RT需实测
视觉检测/点云处理10~100毫秒软实时普通Linux即可
机器人关节控制1~10毫秒准硬实时PREEMPT_RT足够

还有一个经验值:不管选什么方案,调度延迟建议控制在控制周期的五分之一到三分之一以下。比如周期是1毫秒,那么调度延迟上界最好在200微秒以内,否则留给控制算法和驱动的执行预算会被严重压缩。

2. 三条主流技术路线,怎么选

2.1 路线一:PREEMPT_RT,让Linux内核本身可抢占

PREEMPT_RT不是换一个操作系统,而是对Linux内核做一系列改造,让原本不可抢占的内核区域变得可以抢占。这些年,大部分改造已经合入主流内核,你只需要在编译内核时选择“Fully Preemptible Kernel”这一项,就能得到一个实时化配置的内核。

它的核心手段有三个:把中断处理程序线程化,变成可以设置优先级的内核线程;把大部分自旋锁替换成支持优先级继承的互斥锁;压缩临界区代码,减少关中断的时间。

改造之后,普通Linux的调度延迟可以从几毫秒压到几十到几百微秒。优点是显而易见的:它仍然是完整的Linux,所有驱动、网络协议栈、容器、ROS生态都能用。缺点是它的最坏延迟仍然受周边环境影响,如果现场有大量中断、驱动有bug、或者固件做了不可屏蔽的中断,延迟依然会飙高。

我的看法是:PREEMPT_RT是“Linux与实时控制兼得”的入门路线,也是成本最低的路线。对软实时和大部分准硬实时场景,它基本够用,项目前期验证阶段更是首选。

2.2 路线二:Xenomai,双内核架构

Xenomai走的是另一条路:在Linux旁边再放一个很小的实时微内核(Cobalt核心),让它跑在比Linux更高的优先级层。Linux本身被当成一个“普通任务”,而实时任务直接跑在Cobalt核心上,由它直接管理中断和调度。这样Linux的进程即使卡了,也不会影响实时任务的确定性。

用户态写Xenomai任务并不算难,它提供一套POSIX接口的皮肤,你用pthread那套思路就能写。RTDM框架则负责管理实时设备驱动,让实时任务可以直接访问硬件。

Xenomai的延迟指标明显好于PREEMPT_RT,用户态实时任务通常能做到几十微秒级别,而且抖动小得多。代价是复杂度上来了:实时环境与Linux环境之间存在切换开销,部分Linux驱动不能直接用,内核升级时也需要同步适配Xenomai版本。如果你做的产品兼顾“Linux生态”和“更硬一点的实时”,Xenomai是比PREEMPT_RT更靠谱的选择。

2.3 路线三:多核异构,让专业的人干专业的事

这是工业界最“老牌”的做法,也是最稳的做法。它从硬件层面拆分职责:一个高算力的应用处理器跑Linux,负责视觉、网络、人机界面、日志;另一个专用实时核或独立MCU跑裸机/RTOS,负责伺服控制、总线同步、安全逻辑。两个核之间通过共享内存、信箱或串行总线通信。

这种方式从根源上避免“Linux能不能实时”的问题,因为Linux根本不需要做实时控制,它只是上位机。控制核的调度延迟可以稳定在微秒级,甚至几十纳秒级,而且不受Linux崩溃、卡死、重启的影响。

缺点是开发成本高:两套工具链、两套代码、跨核通信协议需要自己定义,控制功能变更时也要重新烧录固件。它适合产品定型、量产、安全要求高的场景,不太适合快速原型验证。

2.4 路线对比速查表

维度PREEMPT_RTXenomai多核异构
最坏延迟典型范围数百微秒到毫秒级数十微秒微秒级甚至更低
对Linux生态的保留完整保留大部分保留,实时侧受限Linux只做非实时任务
开发难度低到中中到高高
典型场景软实时、数据采集、中控机器人、运动控制、总线主站伺服驱动、量产控制器
是否需要额外硬件否否通常需要SoC或MCU配合

我的建议比较直接:记忆项目或样机验证,先用PREEMPT_RT跑通,花不了多少成本;如果实测延迟不达标,再评估Xenomai;如果是做批量出货的产品,直接考虑异构,别再拿Linux硬扛。

3. 决定成败的核心细节

3.1 调度器配置与优先级反转

无论选哪条路线,用户态实时任务的上手姿势几乎一样:把线程调度策略改成SCHED_FIFO或SCHED_RR,然后设置一个较高的优先级。普通Linux任务是SCHED_OTHER,优先级的有效范围是1到99,实时任务一般设到80到90比较合理,太高容易挤占内核线程,太低又会被其他高优先级用户进程干扰。

SCHED_FIFO的意思是:任务一旦执行,只有它主动让出CPU或等更高优先级任务,才能被换下。所以实时任务里必须有等待操作,通常用clock_nanosleep等待下一个周期。如果任务忙循环不阻塞,整个系统都会被它拖死,这不是玩笑。

这里有个经常翻车的概念:优先级反转。高优先级任务等着一个锁,而这个锁被低优先级任务拿着,同时中优先级任务一直在抢CPU,导致高优先级任务被间接饿死。解决方法是使用支持优先级继承的互斥锁。在pthread里就是创建mutex时设置PTHREAD_PRIO_INHERIT协议,这样低优先级任务持有锁期间会临时提升到高优先级任务的级别,把锁释放后再降回来。

实时任务代码里还应该避免调用printf、malloc、普通sleep这类阻塞操作。打印日志、动态分配内存、相对时间sleep都会引入不确定延迟。正确姿势是预分配内存、用带缓冲的日志机制、用绝对时间点做周期同步。

3.2 内存锁、页错误与确定性

前面说过,缺页错误是实时延迟的隐形杀手。默认情况下,Linux应用程序的内存是“懒惰加载”的,你申请了一大块内存,物理页可能还没真正分配。进程访问一个新页面时,内核现场分配物理页,这个过程少则几微秒,多则上百微秒。

解决办法是在实时任务启动时把内存锁进物理内存。pthread代码里通常做两件事:先用mlockall(MCL_CURRENT | MCL_FUTURE)把所有当前和未来的内存页锁住,再把实时任务用到的缓冲区和栈一次性初始化,避免运行时扩张。

锁内存的作用是让内核不把实时任务的内存页换出到交换分区或压缩内存,但也别滥用,锁太多内存会挤压系统其他部分。经验值是只锁实时任务自身及其依赖的共享内存缓冲,普通任务保持默认。

另外要把实时线程绑定到固定的CPU核。配合CPU隔离,能显著减少缓存抖动。绑核用sched_setaffinity,最好在创建线程之后、设置调度策略之前完成,因为一旦线程开始运行,迁移可能引入一次额外的延迟。

3.3 CPU隔离与中断亲和性

实时任务最怕被打扰。哪怕是你设置了高优先级,内核线程、软中断、本地定时器还是会在同一个CPU核上制造抖动。所以成熟的实时系统都会做两件事:CPU隔离和中断亲和性设置。

隔离的方法是在内核启动参数里指定哪些核不参与普通调度。比如有4个核,想用2号和3号核专门跑实时任务,可以加:

isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3

isolcpus让普通进程默认不落到2、3号核;nohz_full关闭了隔离核上不必要的定时器滴答;rcu_nocbs避免RCU回调干扰。这三个参数通常一起用。

中断亲和性用 /proc/irq 下的文件配置。查看 /proc/interrupts 找到占比较高的中断号,然后把它们绑定到非实时核:

echo 3 > /proc/irq/31/smp_affinity

这里的“3”是CPU掩码,表示发给0号和1号核。实际值要根据自己的核编号换算,别照抄。

在我参与的一个电流环Demo上,只加了isolcpus和中断亲和性,最大延迟就从接近1.8毫秒降到了300微秒左右。这个优化投入产出比非常高,值得先做。

3.4 异构路线中的核间通信

如果你选了多核异构方案,Linux核和控制核之间的数据通路就是整个系统的主动脉。最常用的是共享内存加中断信号。Linux核把目标位置、参数写入共享内存,然后触发一个mailbox中断,控制核收到中断后从共享内存取数据,计算并执行。

共享内存看似简单,真正做起来有几个坑。首先是缓存一致性。两个核同时读写相邻的内存地址,会导致缓存行频繁失效,性能急剧下降。解决办法是数据结构按64字节对齐,并且让两个核分别读写的字段分布在不同缓存行上,避免伪共享。

其次是并发访问。最简单的安全模型是生产者消费者模式:一侧写、一侧读,用环形缓冲区和原子索引来避免同时写。生产者和消费者各维护自己的读写位置,通过原子操作更新,配合内存屏障保证顺序。双缓冲也常用:Linux核把数据写进A区,控制核从B区读取上一帧;切换帧时两个核用标志位配合。

最后是通信协议要有明确的超时和错误校验。共享内存里传的如果是位置指令,一旦数据损坏或写了一半被读走,后果就是机械臂冲出去撞坏设备。一定要加了校验和、序列号、通信看门狗。

4. 动手实操:把延迟从毫秒压到百微秒

4.1 编译一个支持实时抢占的内核

如果你的发行版没有现成的RT内核包,就需要自己编一个。这不是什么玄学操作,但有一些关键步骤不能省。

准备一台x86或ARM开发机,下载Linux内核源码,进入解压目录后启动配置界面:

tar xJf linux-x.y.z.tar.xz cd linux-x.y.z make menuconfig

在配置界面里找到内核特性菜单,把Preemption Model选成Fully Preemptible Kernel (Real-Time)。这个选项在较新的内核版本里已经集成了PREEMPT_RT的全部改造,编译系统会自动把相应的锁、中断、调度相关代码切到实时模式。

然后编译安装:

make -j$(nproc) sudo make modules_install install

编译时间取决于机器的核数和内核配置项多少,快则十几分钟,慢则一两小时。装完后用新的内核引导,并在启动参数里加入CPU隔离配置。如果你用的是GRUB,在 /etc/default/grub 的GRUB_CMDLINE_LINUX里添加:

GRUB_CMDLINE_LINUX="quiet splash isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3"

更新引导配置后重启,用 uname -a 确认内核版本和参数生效。

生产环境我仍然建议优先用发行版维护的RT内核包。自己编译适合验证和学习,也方便开额外的调试选项,但长期维护成本高。

4.2 编写一个合格的实时控制任务

下面这段代码是一个最小可用的实时任务骨架,它做的事情只有三件:绑定CPU、设置实时优先级、锁内存,然后在固定周期里执行控制函数。控制函数的具体逻辑这里用注释占位,你可以替换成自己的电机控制、数据采集或者总线发送代码。

#define _GNU_SOURCE #include <pthread.h> #include <sched.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <sys/mman.h> static void timespec_add(struct timespec *t, long ns) { t->tv_nsec += ns; if (t->tv_nsec >= 1000000000L) { t->tv_nsec -= 1000000000L; t->tv_sec++; } } static void do_control(void) { /* 在这里放你的控制算法、IO读写、总线发送 */ } static void *rt_loop(void *arg) { (void)arg; struct timespec next; clock_gettime(CLOCK_MONOTONIC, &next); while (1) { do_control(); timespec_add(&next, 1000000L); /* 1ms周期 */ clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next, NULL); } return NULL; } int main(void) { pthread_t t; pthread_attr_t attr; struct sched_param sp; cpu_set_t set; /* 锁内存,避免运行期缺页 */ if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0) { perror("mlockall"); return 1; } pthread_attr_init(&attr); /* 绑定到3号核 */ CPU_ZERO(&set); CPU_SET(3, &set); pthread_attr_setaffinity_np(&attr, sizeof(set), &set); /* 实时调度和优先级 */ sp.sched_priority = 80; pthread_attr_setschedpolicy(&attr, SCHED_FIFO); pthread_attr_setschedparam(&attr, &sp); pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); pthread_create(&t, &attr, rt_loop, NULL); pthread_join(t, NULL); return 0; }

注意几个容易踩坑的点。第一,pthread_attr_setinheritsched必须设为PTHREAD_EXPLICIT_SCHED,否则线程会继承创建者的调度策略,attr里设置全白费。第二,优先级88到90算比较激进,如果系统里跑了很多内核实时线程,建议先从80起步,实测没有明显冲突再往上加。第三,循环里周期等待用的是绝对时间点CLOCK_MONOTONIC加TIMER_ABSTIME,不是相对时间sleep,这样不会因为单次执行超时导致周期累积漂移。

4.3 用延迟测试工具验证结果

代码写完了,不能光靠“感觉系统挺快”来验收,一定要跑量化测试。最常用的延迟测试工具是rt-tests套件里的cyclictest,它会在指定线程数上反复测量实际唤醒间隔与理想间隔的差值,输出最小、平均和最大延迟。

比如跑5个实时线程,每个线程优先级90,间隔1毫秒,测试10万次:

sudo cyclictest -t 5 -p 90 -i 1000 -l 100000 -n

结果里的Max一列就是这段时间内观测到的最大延迟。如果你的控制周期是1毫秒、任务预算只有200微秒,那么Max必须远小于200微秒才算通过。我见过很多团队只盯着平均延迟,平均只有几十微秒就宣布“达标”,结果现场一跑Max飙到几毫秒,立刻出事。

测试一定要带真实负载。你可以在另一个核上跑网络压测、磁盘读写、编译任务,模拟现场工作条件。我实测过同一块板子,空载时PREEMPT_RT最大延迟只有130微秒,加上网络和磁盘负载后直接冲到1.5毫秒。隔离核和中断亲和性做了之后,再放到同样负载下,最大延迟降回280微秒左右。这就是为什么第四节里那些参数优化不能省。

如果测试已经做了没有隔离,先做隔离再重测;如果隔离后还是超预算,再考虑上Xenomai或直接换异构方案。数据说了算。

5. 常见问题与排查技巧

5.1 高频问题速查表

现场现象可能原因排查方向
实时任务每隔一段时间出现一次大抖动网络中断或磁盘中断抢占了CPU查看 /proc/interrupts,把高频率中断绑到非实时核
设置高优先级后系统直接卡死实时任务忙循环不阻塞检查循环里有没有等待/睡眠,是否误用了空转
平均延迟很低,最大延迟偶尔爆表存在缺页错误或CPU缓存污染用mlockall锁页,绑定CPU,隔离邻居核
双核异构通信数据不对或丢帧共享内存伪共享、并发读写未同步用环形缓冲+原子索引,数据结构64字节对齐,加序列号
高优先级任务被低优先级任务拖住优先级反转检查mutex是否设置PTHREAD_PRIO_INHERIT
实时任务和Linux任务交叉时延迟升高缓存/总线竞争、CPU未隔离将实时任务绑核,隔离专用核,关闭该核的定时器滴答
编译完RT内核启动报错启动参数没生效或内核模块不一致用uname -a检查,确认引导用的确实是新内核

5.2 一些源自现场的避坑心得

第一,先测基线再谈优化。拿到一个平台,不要上来就调参数。先跑一遍默认内核下的延迟测试,记录平均和最大延迟。这样后面每一步优化有没有效果,一眼就能看出来,不会被玄学影响。

第二,看最坏值,不看平均值。实时控制的世界里,平均值再漂亮也没用,真正决定产品能不能交付的是Max指标和超限次数。测试时间尽量大于等于24小时,很多偶发抖动是跑几分钟发现不了的。

第三,给延迟预算留足余量。控制周期1毫秒,调度延迟实际测出来150微秒,看着很健康,但别忘了控制算法本身也要时间,执行器、传感器、通信链路上还有各自的延迟。我习惯把调度延迟控制在总预算的三分之一以内,剩下的留给算法和IO。

第四,现场条件决定一切。实验室里跑得好不代表产线上跑得好。温度变化、总线负载、网络波动、固件升级都可能导致延迟特性变化。验收测试时尽量接近真实工况,最好把实时延迟监控写进系统日志,做一个常驻的看门狗任务。

第五,异构不代表万事大吉。如果你选的是Linux+RTOS双核方案,核间通信本身就是最大的不确定性来源。通信协议要设计好超时、重传、数据校验,还要做故障注入测试。我见过很多异构项目,实时核很稳,最后崩溃在共享内存写了一半被Linux核读走这种低级问题上。

6. 项目落地时,我的一些体会

这个话题我陆陆续续折腾了好几年,最大的感受是:别再问“Linux能不能做实时控制”,而要问“我的项目真正需要多硬的实时,以及我能不能接受改造代价”。方案没有绝对的好坏,只有匹配不匹配。

如果是快速验证或者内部工具,我建议直接开PREEMPT_RT,再加CPU隔离和绑核,这一套下来已经能覆盖大部分准实时场景。如果产品对延迟有硬性要求,比如伺服、总线、安全逻辑,就别在Linux上死磕,老老实实上Xenomai或者异构架构。

还有一个特别想分享的小习惯:拿到任何新平台,第一周先写一个空转的实时任务,跑24小时延迟采集,把最大延迟和超限次数记录在案。这个数字就是你整个项目后续所有控制任务的预算上限。很多项目延期,根本不是算法没调好,而是连自己的最差情况都不知道,现场一出抖动就手忙脚乱。

最后一句老生常谈但确实管用:实时性不是某一层软件单独兑现的,而是硬件选型、内核配置、驱动质量、应用编码、压力测试,五层一起兑现。你偷懒的任何一层,都会在最大延迟那个数字里还给你。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 14:32:52

TSX如何击穿KASLR:硬件侧信道下的内核地址随机化破解探秘

第一次看到这个标题的时候&#xff0c;我的第一反应是&#xff1a;KASLR 又又又被击穿了。在 2020 年前后那批“瞬态执行类漏洞”研究里&#xff0c;Intel TSX 几乎成了绕过内核地址随机化的标配放大器&#xff0c;每次出现都让人觉得“哦&#xff0c;居然还能这样玩”。Kernel…

作者头像 李华
网站建设 2026/10/20 14:32:51

OpenClaw本地部署实战:用WSL2和Docker打造私有AI助理

1. 先搞清楚 OpenClaw 到底是什么 1.1 它不是又一个聊天机器人 最近总有人问我 OpenClaw 是不是类似智能助手客户端&#xff0c;或者是不是某个新出的开源对话项目。其实都不太准确。OpenClaw 是一个定位很清楚的个人 AI 助理框架&#xff0c;名字致敬了经典游戏《黑与白》里那…

作者头像 李华
网站建设 2026/10/20 14:32:46

微电网日前经济调度:风光储与需求响应的MILP建模实战

做微电网调度的同行应该都有同感&#xff1a;光伏风电一接入&#xff0c;原来那套“负荷多大就发多少”的思路直接失灵。白天光伏出力上来&#xff0c;电价反而低&#xff1b;晚上负荷高峰&#xff0c;风电出力又往下掉。这个“错位”不是靠人拍脑袋能解决的&#xff0c;尤其当…

作者头像 李华
网站建设 2026/10/20 14:32:30

G4F聚合框架实测:免费大模型选型与避坑指南

注意&#xff0c;我对你提到的具体开源工具名称和其中的模型供应情况比较模糊——因为这类聚合测试框架变化太快&#xff0c;而且不同版本的 provider 列表经常改。为了避免以讹传讹&#xff0c;下面我只以“G4F 这类聚合测试框架”作为讨论对象&#xff0c;具体模型名称也尽量…

作者头像 李华
网站建设 2026/10/20 14:31:46

SKILL.md:测试人员的AI上岗操作证与人机协作协议

1. 项目概述&#xff1a;SKILL.md 不是文档&#xff0c;是 Agent 的“上岗操作证”你有没有遇到过这样的场景&#xff1a;团队里新来一位测试同学&#xff0c;被安排接入一个刚上线的自动化测试 Agent&#xff0c;结果对着控制台发呆——不是不会写代码&#xff0c;而是根本不知…

作者头像 李华
网站建设 2026/10/20 14:31:31

ARM64 CentOS 7 源码编译 MySQL 5.7 完整实战指南

ARM64的机器这几年越来越多&#xff0c;尤其是云平台出了各种鲲鹏、飞腾、倚天之类的实例。但问题是&#xff0c;大量老业务还死在MySQL 5.7上&#xff0c;不能说升级就升级。最近我就在一台CentOS 7的ARM64服务器上折腾着把MySQL 5.7装起来&#xff0c;过程比x86上要麻烦不少。…

作者头像 李华