当前位置: 首页 > article >正文

Linux CFS 的调度周期调整:任务数量对调度粒度的影响

一、简介1.1 背景与重要性在实时嵌入式系统、高性能计算HPC和云计算基础设施中Linux 完全公平调度器Completely Fair Scheduler, CFS是默认的进程调度算法。CFS 自 Linux 2.6.23 版本引入以来一直是 Linux 内核最核心的组件之一它通过红黑树Red-Black Tree数据结构实现了 O(log n) 时间复杂度的任务调度。CFS 调度周期sched_latency_ns是 CFS 的核心参数它定义了每个可运行任务至少获得一次 CPU 时间的时间窗口。理解调度周期的动态调整机制对于以下场景至关重要实时音视频处理需要保证低延迟的同时避免过度频繁的上下文切换高频交易系统微秒级的调度延迟直接影响交易性能容器化部署多租户环境下需要平衡公平性与系统开销嵌入式实时系统资源受限环境下优化调度开销掌握 CFS 调度周期的调整原理能够帮助系统管理员和开发者在延迟敏感型应用与系统吞吐量之间找到最佳平衡点。1.2 为什么任务数量会影响调度粒度CFS 的设计哲学是完全公平但公平是有代价的。当系统中有大量任务时如果仍坚持固定的调度周期会导致每个任务分得的时间片过短增加上下文切换开销缓存失效频繁降低 CPU 效率调度器本身消耗过多 CPU 时间因此CFS 采用了自适应调度周期策略任务数少时保证低延迟任务数多时自动扩展周期以减少开销。这种动态调整机制是 Linux 内核调度器的精妙之处也是本文深入剖析的重点。二、核心概念2.1 CFS 调度周期的定义调度周期Scheduling Period在内核中通过sysctl_sched_latency变量控制默认值为6ms6000000 纳秒。它表示在一个周期内每个可运行任务至少应该获得一次执行机会。数学表达式为时间片slice 调度周期 × (任务权重 / 所有任务总权重)2.2 关键内核参数参数名内核变量默认值含义调度延迟sched_latency_ns6ms目标调度周期最小粒度sched_min_granularity_ns0.75ms单个任务最小执行时间唤醒抢占粒度sched_wakeup_granularity_ns1ms唤醒任务抢占当前任务的最小优势2.3 动态调整阈值nr_running ≥ 8CFS 动态调整的核心逻辑基于运行队列中的任务数量nr_runningif (nr_running 8) { period sched_latency_ns; // 固定 6ms } else { period nr_running × sched_min_granularity_ns; // 动态扩展 }为什么阈值是 8这是内核开发者通过大量基准测试确定的平衡点少于 8 个任务时6ms 周期能保证每个任务获得足够且公平的 CPU 时间超过 8 个任务时固定周期会导致时间片小于最小粒度因此需要扩展周期2.4 虚拟运行时间vruntimeCFS 使用虚拟运行时间virtual runtime来衡量任务的 CPU 使用情况// 内核代码片段简化 vruntime delta_exec × (NICE_0_LOAD / task_weight);所有任务按 vruntime 排序在红黑树中最左侧vruntime 最小的任务获得 CPU。调度周期的调整直接影响 vruntime 的增长速度进而影响任务调度的公平性。三、环境准备3.1 硬件环境要求CPUx86_64 架构Intel/AMD支持 4 核以上便于观察多任务调度内存≥ 4GB避免内存成为瓶颈磁盘SSD 推荐快速编译内核3.2 软件环境配置3.2.1 操作系统版本推荐使用Ubuntu 22.04 LTS或CentOS Stream 9内核版本 ≥ 5.10# 检查当前内核版本 uname -r # 输出示例5.15.0-91-generic # 检查系统信息 cat /etc/os-release3.2.2 必备工具安装# 安装编译工具和调试工具 sudo apt update sudo apt install -y build-essential git bc bison flex libssl-dev \ libncurses5-dev dwarves libelf-dev linux-headers-$(uname -r) \ trace-cmd kernelshark bpfcc-tools # 安装性能分析工具 sudo apt install -y sysstat htop cpuset3.2.3 内核源码获取用于深入分析# 下载与当前系统匹配的内核源码 cd /usr/src sudo apt install -y linux-source-$(uname -r | cut -d- -f1) cd /usr/src/linux-source-*/ # 根据实际版本调整路径 # 或者从 kernel.org 获取特定版本 wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.tar.xz tar -xvf linux-5.15.tar.xz cd linux-5.153.3 调度参数查看与临时修改# 查看当前 CFS 调度参数 sysctl kernel.sched_latency_ns sysctl kernel.sched_min_granularity_ns sysctl kernel.sched_wakeup_granularity_ns # 输出示例 # kernel.sched_latency_ns 6000000 (6ms) # kernel.sched_min_granularity_ns 750000 (0.75ms) # kernel.sched_wakeup_granularity_ns 1000000 (1ms) # 临时修改参数立即生效重启失效 sudo sysctl kernel.sched_latency_ns10000000 # 改为 10ms sudo sysctl kernel.sched_min_granularity_ns1000000 # 改为 1ms # 永久修改写入配置文件 echo kernel.sched_latency_ns 8000000 | sudo tee /etc/sysctl.d/99-cfs-tuning.conf sudo sysctl --system # 重新加载配置四、应用场景4.1 云原生容器平台的调度优化在 Kubernetes 集群中单个节点可能运行数十个 Pod每个 Pod 包含多个容器进程。默认的 CFS 参数在容器密度高时表现不佳典型场景一个 8 核节点运行 50 个 Pod每个 Pod 有 2 个进程总计 100 个可运行任务。按照默认参数理论时间片 6ms / 100 0.06ms60 微秒这远小于sched_min_granularity_ns0.75ms此时 CFS 自动将周期扩展为100 × 0.75ms 75ms。这意味着一个任务最坏情况下需要等待 75ms 才能获得 CPU对于延迟敏感型微服务如 API 网关、支付服务是不可接受的。解决方案通过调整sched_min_granularity_ns和sched_latency_ns在高密度场景下保持较低的调度延迟。例如将最小粒度降至 0.5ms周期降至 4ms可将最大延迟控制在 50ms 以内同时保持合理的上下文切换开销。4.2 实时音视频编解码系统在视频会议系统中音视频编解码任务需要周期性执行通常每 33ms 一帧对应 30fps。如果系统中同时存在后台数据压缩任务低负载时 8 任务固定 6ms 周期保证编解码任务及时获得 CPU避免画面卡顿高负载时 8 任务周期自动扩展编解码任务可能错过 deadline通过理解 CFS 的扩展机制开发者可以使用SCHED_FIFO或SCHED_RR将编解码任务设为实时优先级或者调整 CFS 参数确保在预期任务数范围内保持固定短周期使用cpuset将关键任务隔离到特定 CPU减少每个运行队列的任务数4.3 高频交易系统量化交易系统通常在用户态处理市场数据要求微秒级延迟。Linux 内核的调度延迟是主要瓶颈之一默认 CFS 参数下调度周期 6ms 对于微秒级应用过于粗糙通过将sched_latency_ns降至 1mssched_min_granularity_ns降至 0.1ms可将调度精度提升至亚毫秒级配合 CPU 隔离isolcpus和禁用节能模式可实现接近裸机的调度延迟五、实际案例与步骤5.1 实验一观察调度周期动态调整行为5.1.1 编写 CPU 密集型测试程序创建cpu_burn.c模拟不同数量的 CPU 密集型任务/* * cpu_burn.c - CPU 密集型任务生成器 * 用途测试 CFS 在不同任务数下的调度行为 * 编译gcc -o cpu_burn cpu_burn.c -O2 */ #define _GNU_SOURCE #include stdio.h #include stdlib.h #include unistd.h #include sys/types.h #include sys/wait.h #include sched.h #include time.h #include string.h #define BURN_TIME_SEC 10 // 每个任务运行时间 // 绑定到特定 CPU避免跨 CPU 迁移干扰观察 void set_cpu_affinity(int cpu_id) { cpu_set_t cpuset; CPU_ZERO(cpuset); CPU_SET(cpu_id, cpuset); if (sched_setaffinity(0, sizeof(cpuset), cpuset) -1) { perror(sched_setaffinity failed); exit(1); } } // 精确计算时间差微秒级 unsigned long long get_time_us() { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, ts); return ts.tv_sec * 1000000ULL ts.tv_nsec / 1000; } int main(int argc, char *argv[]) { if (argc ! 3) { fprintf(stderr, 用法: %s 任务数 绑定CPU\n, argv[0]); fprintf(stderr, 示例: %s 5 0 # 创建5个任务绑定到CPU0\n); return 1; } int num_tasks atoi(argv[1]); int target_cpu atoi(argv[2]); int i; printf(创建 %d 个 CPU 密集型任务绑定到 CPU %d\n, num_tasks, target_cpu); printf(父进程 PID: %d\n, getpid()); for (i 0; i num_tasks; i) { pid_t pid fork(); if (pid 0) { // 子进程 set_cpu_affinity(target_cpu); unsigned long long start get_time_us(); volatile unsigned long long counter 0; // CPU 密集型循环 while ((get_time_us() - start) BURN_TIME_SEC * 1000000ULL) { counter; // 每 1000 万次迭代打印一次避免过度输出 if (counter % 10000000 0) { unsigned long long elapsed get_time_us() - start; printf([PID %d] 运行中... 已执行 %llu us, 计数器: %llu\n, getpid(), elapsed, counter); } } printf([PID %d] 完成总迭代次数: %llu\n, getpid(), counter); exit(0); } else if (pid 0) { perror(fork failed); exit(1); } } // 父进程等待所有子进程 for (i 0; i num_tasks; i) { wait(NULL); } printf(所有任务完成\n); return 0; }5.1.2 编译与基础测试# 编译测试程序 gcc -o cpu_burn cpu_burn.c -O2 # 测试 4 个任务少于 8 个应使用固定周期 sudo ./cpu_burn 4 0 # 在另一个终端观察调度统计 watch -n 1 cat /proc/sched_debug | grep -A 5 cpu#05.1.3 使用 schedstat 观察调度延迟创建monitor_sched.sh脚本实时监控调度统计#!/bin/bash # monitor_sched.sh - 监控 CFS 调度统计信息 # 用法: sudo ./monitor_sched.sh PID PID$1 INTERVAL1 if [ -z $PID ]; then echo 用法: $0 PID exit 1 fi echo 监控 PID $PID 的调度统计按 CtrlC 停止 echo 时间戳, 等待时间(ns), 执行时间(ns), 时间片数 while true; do if [ -f /proc/$PID/schedstat ]; then # schedstat 格式: 执行时间 等待时间 时间片数 read EXEC WAIT SLICE /proc/$PID/schedstat TIMESTAMP$(date %s%N) echo $TIMESTAMP, $WAIT, $EXEC, $SLICE else echo 进程 $PID 不存在或已结束 break fi sleep $INTERVAL done5.1.4 对比实验4 任务 vs 16 任务# 实验 A4 个任务低于阈值 sudo ./cpu_burn 4 0 BG_PID$! sleep 2 sudo ./monitor_sched.sh $BG_PID sched_4tasks.csv sleep 8 kill %1 2/dev/null; kill %2 2/dev/null # 实验 B16 个任务高于阈值触发周期扩展 sudo ./cpu_burn 16 0 BG_PID$! sleep 2 sudo ./monitor_sched.sh $BG_PID sched_16tasks.csv sleep 8 kill %1 2/dev/null; kill %2 2/dev/null # 使用 Python 分析结果 python3 EOF import pandas as pd import numpy as np df4 pd.read_csv(sched_4tasks.csv) df16 pd.read_csv(sched_16tasks.csv) print( 4 任务场景固定周期) print(f平均等待时间: {df4[ 等待时间(ns)].mean()/1e6:.2f} ms) print(f最大等待时间: {df4[ 等待时间(ns)].max()/1e6:.2f} ms) print(\n 16 任务场景周期扩展) print(f平均等待时间: {df16[ 等待时间(ns)].mean()/1e6:.2f} ms) print(f最大等待时间: {df16[ 等待时间(ns)].max()/1e6:.2f} ms) print(f理论周期: 16 × 0.75ms 12ms) EOF预期结果4 任务时最大等待时间接近 6ms固定周期16 任务时最大等待时间接近 12ms扩展周期5.2 实验二动态调整调度参数5.2.1 编写参数动态调整脚本#!/bin/bash # tune_cfs.sh - 动态调整 CFS 调度参数 # 用法: sudo ./tune_cfs.sh latency_ms min_granularity_ms LATENCY_NS$(($1 * 1000000)) GRANULARITY_NS$(($2 * 1000000)) echo 调整 CFS 参数: echo sched_latency_ns: ${LATENCY_NS} ns (${1} ms) echo sched_min_granularity_ns: ${GRANULARITY_NS} ns (${2} ms) # 备份当前值 echo 备份当前参数到 /tmp/cfs_backup.conf sysctl kernel.sched_latency_ns kernel.sched_min_granularity_ns /tmp/cfs_backup.conf # 应用新参数 sysctl -w kernel.sched_latency_ns$LATENCY_NS sysctl -w kernel.sched_min_granularity_ns$GRANULARITY_NS echo 当前参数: sysctl kernel.sched_latency_ns kernel.sched_min_granularity_ns5.2.2 对比不同参数下的性能# 保存默认参数 sudo sysctl kernel.sched_latency_ns kernel.sched_min_granularity_ns default_cfs.conf # 测试场景 1默认参数6ms, 0.75ms echo 测试场景 1默认参数 sudo ./tune_cfs.sh 6 0.75 sudo ./cpu_burn 16 0 # 记录性能数据... # 测试场景 2激进低延迟3ms, 0.375ms echo 测试场景 2激进低延迟 sudo ./tune_cfs.sh 3 0.375 sudo ./cpu_burn 16 0 # 预期上下文切换增加但延迟降低 # 测试场景 3高吞吐量12ms, 1.5ms echo 测试场景 3高吞吐量 sudo ./tune_cfs.sh 12 1.5 sudo ./cpu_burn 16 0 # 预期上下文切换减少适合批处理 # 恢复默认参数 sudo sysctl -p default_cfs.conf5.3 实验三使用 ftrace 分析调度器行为5.3.1 启用调度器跟踪#!/bin/bash # trace_cfs.sh - 使用 ftrace 跟踪 CFS 调度事件 # 挂载 debugfs如果未挂载 mountpoint -q /sys/kernel/debug || sudo mount -t debugfs none /sys/kernel/debug cd /sys/kernel/debug/tracing # 清除旧数据 echo 0 tracing_on echo trace # 启用调度事件 echo 1 events/sched/sched_switch/enable echo 1 events/sched/sched_stat_wait/enable echo 1 events/sched/sched_stat_sleep/enable # 设置过滤器只跟踪我们的测试进程 echo *cpu_burn* events/sched/sched_switch/filter # 开始跟踪 echo 1 tracing_on echo 跟踪已启动运行测试程序后按回车停止... read # 停止跟踪 echo 0 tracing_on # 保存结果 cat trace /tmp/cfs_trace.txt echo 跟踪结果已保存到 /tmp/cfs_trace.txt # 禁用事件 echo 0 events/sched/sched_switch/enable echo 0 events/sched/sched_stat_wait/enable echo 0 events/sched/sched_stat_sleep/enable5.3.2 分析调度延迟# 分析跟踪结果计算实际调度周期 grep sched_switch /tmp/cfs_trace.txt | head -20 # 提取时间戳计算间隔 awk /sched_switch/ { if (last) { delta $1 - last; if (delta 0.001) printf 调度间隔: %.3f ms\n, delta; } last $1 } /tmp/cfs_trace.txt5.4 实验四内核源码分析与自定义调试5.4.1 定位关键源码在下载的内核源码中CFS 调度周期调整的核心逻辑位于# 核心文件 vim kernel/sched/fair.c # CFS 主实现 vim kernel/sched/sched.h # 调度器头文件 vim kernel/sysctl.c # sysctl 接口5.4.2 关键代码分析/* * kernel/sched/fair.c 中的核心函数 * 计算调度周期的逻辑 */ static u64 __sched_period(unsigned long nr_running) { // 如果任务数超过 8或者设置了 sched_latency_ns 小于最小粒度的 8 倍 if (unlikely(nr_running sched_nr_latency)) return nr_running * sysctl_sched_min_granularity; // 否则使用固定的目标延迟 return sysctl_sched_latency; } /* * 其中 sched_nr_latency 的计算 * sched_nr_latency sysctl_sched_latency / sysctl_sched_min_granularity * 默认值6ms / 0.75ms 8 */5.4.3 添加自定义内核日志可选如需深入调试可修改内核添加日志// 在 __sched_period 函数中添加仅供调试 static u64 __sched_period(unsigned long nr_running) { u64 period; if (unlikely(nr_running sched_nr_latency)) { period nr_running * sysctl_sched_min_granularity; printk(KERN_DEBUG CFS: 扩展周期到 %llu ns (nr_running%lu)\n, period, nr_running); } else { period sysctl_sched_latency; printk(KERN_DEBUG CFS: 固定周期 %llu ns (nr_running%lu)\n, period, nr_running); } return period; }重新编译内核并安装后可通过dmesg -w实时观察周期调整行为。六、常见问题与解答Q1为什么我的系统sched_latency_ns显示为 24ms 而不是 6msA某些发行版如 CentOS为了服务器性能会修改默认参数。检查方法# 查看当前值 sysctl kernel.sched_latency_ns # 临时改回默认值 sudo sysctl -w kernel.sched_latency_ns6000000 sudo sysctl -w kernel.sched_min_granularity_ns750000Q2调整 CFS 参数后系统变得卡顿或无响应A可能原因最小粒度过小如果sched_min_granularity_ns 1ms上下文切换开销可能超过任务执行时间周期过短大量任务时过短的周期导致调度器占用过多 CPU解决方案# 恢复安全默认值 sudo sysctl -w kernel.sched_latency_ns12000000 # 12ms sudo sysctl -w kernel.sched_min_granularity_ns1500000 # 1.5msQ3如何验证调度周期确实发生了调整A使用perf工具统计上下文切换频率# 安装 perf sudo apt install linux-tools-common linux-tools-generic # 监控上下文切换 sudo perf stat -e context-switches -a sleep 10 # 对比不同任务数下的切换频率 # 4 任务时约 400-600 次/秒 # 16 任务时约 800-1200 次/秒如果周期扩展增长应小于线性Q4实时任务SCHED_FIFO是否受 CFS 参数影响A不受影响。SCHED_FIFO和SCHED_RR是实时调度类优先级高于 CFSSCHED_NORMAL。它们不受sched_latency_ns等参数控制而是遵循实时调度的抢占规则。Q5容器cgroups内的任务如何影响调度周期ACFS 支持 cgroup 级别的调度控制。每个 cgroup 有独立的cpu.shares和cpu.cfs_quota_us但调度周期是全局的所有任务共享同一周期计算逻辑。在 cgroup v2 中可以使用cpu.latency控制组内延迟# 创建 cgroup sudo mkdir /sys/fs/cgroup/mygroup echo 100000 | sudo tee /sys/fs/cgroup/mygroup/cpu.max # 限制 100ms 每 100ms echo 0 | sudo tee /sys/fs/cgroup/mygroup/cpu.latency # 启用低延迟模式七、实践建议与最佳实践7.1 参数调优决策树开始 │ ├─ 延迟敏感型应用 10ms 要求 │ ├─ 是 → 考虑 SCHED_FIFO/RR 实时调度 │ └─ 否 → 继续 │ ├─ 任务数通常 8 │ ├─ 是 → 保持默认参数6ms/0.75ms │ └─ 否 → 继续 │ ├─ 吞吐量优先 │ ├─ 是 → 增大周期12-24ms增大数据粒度2-4ms │ └─ 否 → 平衡型调整 │ └─ 平衡型调整 ├─ 周期6-10ms └─ 粒度0.75-1ms7.2 生产环境调优建议场景 AWeb 服务器Nginx/Apache# 目标高并发连接下的低延迟响应 # 特点大量短连接任务数波动大 # 建议参数 echo kernel.sched_latency_ns 4000000 | sudo tee -a /etc/sysctl.conf # 4ms echo kernel.sched_min_granularity_ns 500000 | sudo tee -a /etc/sysctl.conf # 0.5ms echo kernel.sched_wakeup_granularity_ns 500000 | sudo tee -a /etc/sysctl.conf sudo sysctl -p场景 B大数据批处理Hadoop/Spark# 目标最大化吞吐量容忍较高延迟 # 特点少量长任务CPU 密集型 echo kernel.sched_latency_ns 24000000 | sudo tee -a /etc/sysctl.conf # 24ms echo kernel.sched_min_granularity_ns 3000000 | sudo tee -a /etc/sysctl.conf # 3ms sudo sysctl -p场景 C混合负载数据库 应用服务器# 目标隔离关键任务避免后台任务干扰 # 策略使用 cgroup CPU 亲和性 # 1. 创建高优先级 cgroup sudo mkdir /sys/fs/cgroup/cpuset/high_prio sudo mkdir /sys/fs/cgroup/cpuset/low_prio # 2. 分配 CPU 核心 echo 0-3 | sudo tee /sys/fs/cgroup/cpuset/high_prio/cpuset.cpus echo 4-7 | sudo tee /sys/fs/cgroup/cpuset/low_prio/cpuset.cpus # 3. 将数据库进程放入高优先级组 echo db_pid | sudo tee /sys/fs/cgroup/cpuset/high_prio/cgroup.procs7.3 调试技巧技巧 1使用schedstat监控特定进程# 实时监控进程的调度延迟 watch -n 0.5 cat /proc/PID/schedstat | awk {print \执行:\\$1/1e6\ms 等待:\\$2/1e6\ms 切片:\\$3}技巧 2使用chrt临时调整调度策略# 将现有进程改为实时调度需谨慎 sudo chrt -f -p 99 PID # FIFO 优先级 99最高 # 以实时优先级启动新进程 sudo chrt -f 50 ./my_realtime_app技巧 3内核编译参数优化# 编译内核时启用调度器调试选项 make menuconfig # 启用以下选项 # Kernel hacking - Scheduler Debugging - SCHEDSTATS # Kernel hacking - Tracers - Kernel Function Tracer7.4 常见错误避免不要盲目追求低延迟将sched_latency_ns设得过低 2ms会导致调度器开销超过 5%注意任务数阈值理解 8 个任务的阈值逻辑在系统设计时控制每个 CPU 的运行队列长度区分全局与 cgroup 参数CFS 周期是全局的cgroup 的cpu.cfs_period_us是配额周期二者不同测试后再上线使用perf和ftrace验证调优效果避免负优化八、总结与应用场景8.1 核心要点回顾本文深入剖析了 Linux CFS 调度器的动态周期调整机制关键结论包括自适应策略CFS 通过nr_running与sched_nr_latency默认 8的比较自动选择固定周期6ms或扩展周期任务数 × 最小粒度阈值意义8 个任务是延迟与开销的平衡点少于 8 个任务保证低延迟多于 8 个任务保证系统稳定性可调参数sched_latency_ns控制目标延迟默认 6mssched_min_granularity_ns控制最小时间片默认 0.75ms二者比值决定阈值sched_nr_latency实战价值通过调整这些参数可以在微秒级延迟的金融交易、毫秒级延迟的音视频处理、秒级延迟的批处理等不同场景间灵活切换8.2 典型应用场景总结场景推荐参数关键策略高频交易1ms / 0.1msCPU 隔离 实时调度实时音视频4ms / 0.5ms任务数控制 cgroup 隔离Web 服务6ms / 0.75ms默认参数监控任务数大数据处理24ms / 3ms增大周期减少切换容器平台8ms / 1ms结合 cgroup 限制8.3 未来研究方向EEVDF 调度器Linux 6.6 引入的 Earliest Eligible Virtual Deadline First 调度器将取代 CFS提供更精确的延迟控制BPF 调度器内核 6.12 支持 BPF 实现的自定义调度器允许用户态灵活定义调度策略异构计算调度ARM big.LITTLE 架构下的调度周期优化考虑能效与性能的平衡8.4 实践建议理解 CFS 调度周期的动态调整机制是 Linux 系统调优的基础技能。建议读者动手实验在测试环境运行本文提供的代码观察不同参数下的实际效果监控先行在生产环境调整前建立schedstat和perf的基线监控渐进调优每次只调整一个参数量化对比效果关注内核演进跟踪 Linux 内核邮件列表LKML了解调度器最新发展通过掌握 CFS 的调度周期调整原理开发者不仅能够优化现有系统的性能更能在设计新一代实时系统时做出明智的架构决策真正实现公平与高效的完美平衡。

相关文章:

Linux CFS 的调度周期调整:任务数量对调度粒度的影响

一、简介1.1 背景与重要性在实时嵌入式系统、高性能计算(HPC)和云计算基础设施中,Linux 完全公平调度器(Completely Fair Scheduler, CFS)是默认的进程调度算法。CFS 自 Linux 2.6.23 版本引入以来,一直是 …...

32-字体反爬

本文需要借助工具:fontcreator,或者在线网站:字体设计在线网站 字体反爬介绍 字体反爬是网站常用的前端反爬手段,核心逻辑是用自定义字体文件替代明文文本,爬虫自动化也无法拿到正确的明文数据 字体反爬原理 本文主…...

无障碍技术实践:OpenClaw+Phi-3-vision-128k-instruct为视障用户描述图片

无障碍技术实践:OpenClawPhi-3-vision-128k-instruct为视障用户描述图片 1. 项目背景与动机 去年冬天的一次地铁站经历让我萌生了这个想法。当时我看到一位视障朋友在站台反复用盲杖试探前方障碍物,而墙上明明贴着"施工绕行"的警示海报。这个…...

三种常见AC/DC转换方案详解与选型指南

1. 交流转直流方案概述在电子设备设计中,将交流电转换为直流电是最基础也是最重要的环节之一。作为一名硬件工程师,我在过去十年里接触过各种AC/DC转换方案,从简单的阻容降压到复杂的开关电源设计。这些方案各有特点,适用于不同的…...

已登CVPR&Nature子刊,小波变换+深度学习杀疯了 !!

融合小波变换的深度学习模型是当前的研究热点之一,这个交叉领域热度高、前景好、创新空间大,只要选对结合点和方法,冲顶会顶刊问题不大。比如Transformer、GNN、KAN、CNN、mamba等,就是目前比较前沿而且热度很高的结合方式&#x…...

AUTOSAR Ethernet Stack深度解析,手把手实现SOME/IP序列化、DDS桥接与时间同步校准

第一章:AUTOSAR以太网协议栈架构概览AUTOSAR以太网协议栈是面向汽车电子域控制器与中央计算平台的关键通信基础设施,其设计严格遵循AUTOSAR Classic Platform规范(R21-11及后续版本),在保持与传统CAN/LIN协议栈统一配置…...

Shell_命令语法、管道和重定向详细介绍

Shell 命令语法、管道和重定向详细介绍 一、Shell 命令基本语法 1.1 命令结构 命令 [选项] [参数]命令:要执行的程序选项:修改命令行为的标志(通常以 - 或 -- 开头)参数:命令操作的对象 示例: ls-l /ho…...

产业园区如何搭建智能化技术服务平台?

观点作者:科易网-国家科技成果转化(厦门)示范基地 一、现状概述:传统产业园区服务的效能瓶颈与转型需求 产业园区作为区域经济发展的重要载体和创新要素集聚的核心区域,近年来在国家创新驱动发展战略的引领下取得了显著…...

Next.js第八课 - 缓存机制

前面几节我们学习了数据获取和数据变更,本节来深入了解 Next.js 的缓存机制。缓存是提升应用性能的关键技术,用好了能让你的应用速度提升好几倍。 缓存架构 Next.js 使用多层缓存来优化性能,理解这个架构很重要: 请求流程: 浏览…...

新鲜出炉!2026简历模板服务商推荐排行 专业评测榜 AI适配/全行业覆盖

一、摘要据中国人力资源开发研究会2026年行业报告显示,国内简历模板服务市场中,仅有30%的服务商能实现ATS系统通过率90%以上,求职者因简历模板不适配、内容不规范导致面试邀约率偏低,平均错失40%的求职机会;企业则因模…...

OpenClaw技能市场探秘:Qwen3.5-9B适配的十佳插件

OpenClaw技能市场探秘:Qwen3.5-9B适配的十佳插件 1. 为什么需要关注Qwen3.5-9B适配插件? 上周我在调试一个自动化周报生成流程时,发现同样的任务脚本在Qwen3.5-9B上运行时,效率比预期低了40%。经过排查才发现,我使用…...

从一次线上事故复盘:我们如何用OWASP ZAP揪出jQuery遗留的AJAX CSRF漏洞

实战复盘:如何用OWASP ZAP挖掘jQuery遗留的AJAX CSRF漏洞 那天凌晨2点,运维群突然炸出一连串报警——某金融模块出现异常转账记录,涉及金额虽不大,但所有操作都显示来自真实用户会话。作为技术负责人,我立刻意识到&…...

0欧姆电阻在电子设计中的关键应用与选型指南

1. 0欧姆电阻的实质与特性在电子工程实践中,0欧姆电阻(Zero-Ohm Resistor)是一种表面贴装或插装形式的特殊电子元件。虽然标称值为零欧姆,但实际测量时会发现其存在微小的阻值——典型值在20-50毫欧之间。这个特性使其既不同于理想…...

别让ChatGPT变成你的安全漏洞:OWASP LLM Top 10(2024)实战避坑指南

别让ChatGPT变成你的安全漏洞:OWASP LLM Top 10(2024)实战避坑指南 当大型语言模型(LLM)从实验室走向企业级应用时,安全风险正以指数级速度增长。2023年某金融科技公司因提示词注入导致百万用户数据泄露的案…...

【独家原创】基于分位数回归PSO-QRLightGBM多变量时序预测-区间预测(多输入单输出) Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...

收藏必备!小白程序员必看:如何用AI智能体操作系统赋能医疗行业?

本文介绍了一项创新性研究,旨在解决大语言模型智能体在医疗场景中的应用难题。传统AI智能体在医疗领域存在权限过大、记忆碎片化、沟通机制单一和医院IT系统死板等问题。为解决这些痛点,研究团队提出了医疗版“AI操作系统”(AOS-H&#xff09…...

鸿蒙应用对接DeepSeek大模型:构建智能问答系统的技术实践

鸿蒙应用对接DeepSeek大模型:构建智能问答系统的技术实践 随着鸿蒙系统(HarmonyOS)在全场景智能终端的深度布局,以及AI大模型技术的快速迭代,将鸿蒙原生应用与DeepSeek大模型深度融合,已成为打造智能问答系…...

《高效能人士的七个习惯》:从内圣到外王的完整方法论

这本书在全世界卖了千万册,斯蒂芬柯维用七个习惯构建了一套从自我管理到影响他人的完整体系。一、前言:比七个习惯更重要的两件事 很多人读这本书只关注七个习惯本身,却忽略了前言中两个至关重要的前提: 1. 积极乐观是一切的起点 …...

从进度到资源:7款适合PMO的项目集管理系统

本文将深入对比7大项目集管理系统:PingCode、Worktile、GanttPRO、奥博思、TAPD、Trello、氚云 在管理大型、跨部门的复杂项目时,PMO(项目管理办公室)常面临资源冲突、信息孤岛和进度失控的挑战。传统的单项目管理工具已难以承载组…...

信息化基础设施层建设

4.1 基础设施层建设 4.1.4 基础软件环境 基础软件环境的理论定位 基础软件环境是企业信息化建设的“操作系统”,其理论任务是为上层应用系统提供统一的运行环境、开发框架、数据服务和协作工具,包括操作系统、数据库、中间件、开发框架、版本控制、协…...

SCH1633-D01 |Murata村田|汽车级|±300度的角速率六轴陀螺仪|惯性导航

SCH1633-D01 |Murata村田|汽车级|300度的角速率六轴陀螺仪|惯性导航用于汽车应用的六自由度XYZ轴陀螺仪和XYZ轴加速度计,带数字SPI接口SCH1633-D01SCH1600传感器系列通过冗余设计选项和内置可调双输出通道为资深客户提供更大的灵活性。●300/s的角速率测量范围●8g的…...

PyCharm Community 版新手一站式安装与配置指南

1. PyCharm Community版是什么? PyCharm Community版是JetBrains公司推出的免费Python集成开发环境(IDE),专为个人开发者和小型项目设计。我第一次接触这个工具时,发现它比想象中要强大得多 - 代码自动补全、错误检查、…...

EXE Ver 适用于 未安装Python 以及包的Windows OS

上图~EXE Ver END...

计算机内存与缓存完全指南

计算机内存与缓存完全指南 目录 计算机存储体系概览内存(RAM)深度解析 2.1 RAM 的基本原理2.2 DRAM vs SRAM2.3 DDR 内存发展历史与对比2.4 内存关键参数详解2.5 内存模组类型(DIMM / SO-DIMM / LPDDR) CPU 缓存深度解析 3.1 缓…...

查重踩坑血泪史:免费软件、PaPerPass、AIGC率、淘宝旗舰店

规避雷区 最近为了查重,折腾得心力交瘁。多方打听、多次数据对比之后,总结了一些“花钱买教训”的经验,写成几个点分享出来,希望能帮大家少走弯路。千万避雷某多多。 1️⃣ 免费软件的“Pass查重”低于10%还算靠谱 经过多个数据…...

通义千问1.5-1.8B-Chat商业应用:企业智能助手快速落地方案

通义千问1.5-1.8B-Chat商业应用:企业智能助手快速落地方案 1. 企业智能助手市场现状与需求 当前企业运营面临人力成本上升、服务标准化不足、数据分析需求激增等挑战。传统解决方案往往需要投入大量资源进行定制开发,而基于大模型的智能助手提供了快速…...

从‘丑拒’到‘真香’:MaterialButton的iconGravity和inset属性,帮你搞定那些烦人的UI细节

从‘丑拒’到‘真香’:MaterialButton的iconGravity和inset属性,帮你搞定那些烦人的UI细节 设计师递过来一张设计稿,要求按钮图标精确位于文字左侧8dp处,且垂直方向与相邻视图严格对齐。你信心满满地用MaterialButton实现&#xf…...

Linux内存监控工具与实战技巧

1. Linux 内存监控概述作为一名运维工程师,我每天都要和服务器内存打交道。内存就像系统的血液,一旦出现异常,整个系统就会变得迟缓甚至崩溃。在Linux系统中,我们可以通过多种方式来监控内存使用情况,每种方法都有其独…...

OpenClaw调试技巧:捕获Qwen3.5-9B错误推理的5个方法

OpenClaw调试技巧:捕获Qwen3.5-9B错误推理的5个方法 1. 为什么需要关注模型推理错误 上周我让OpenClaw自动整理项目文档时,发现它把"API响应时间优化方案"归类到了"前端样式规范"目录。这个看似简单的错误背后,是Qwen3…...

AD09实战:3分钟搞定BOM表导出与自动化分类(附模板下载)

AD09实战:3分钟高效生成智能分类BOM表的完整指南 在电子设计领域,BOM表(物料清单)是连接设计与生产的核心纽带。传统手工整理BOM表不仅耗时费力,还容易因人为疏忽导致元器件分类错误、数量统计偏差等问题。AD09作为业界…...