- 博客(19)
- 收藏
- 关注
原创 如何减少 kswapd 线程触发的同步回收压力
本文介绍了如何减少Linux系统中kswapd线程触发的同步回收压力。主要措施包括:在应用层优化内存分配与释放,控制匿名页使用;调整内核参数如内存水位、Swappiness等;使用大页、NUMA绑定等内存分配策略;以及通过监控工具分析内存状态。针对数据库、实时计算等特殊场景提出了具体优化建议,核心思路是降低内存压力、精细化参数配置、合理分配资源,以平衡内存使用与系统性能。
2025-09-01 09:14:18
726
原创 malloc中的sysmalloc函数详解
下面把sysmalloc的整体执行路径和每个关键分支,按“先总览、后细化”的方式梳理一遍。toptop。
2025-09-01 09:14:03
1056
原创 c++中的条件变量虚假唤醒问题及解决方案
C++11条件变量虚假唤醒问题及解决方案 摘要:C++11中的条件变量在多线程同步时可能发生虚假唤醒现象,即线程被唤醒但条件并未满足。主要原因包括多核调度竞争、线程时序问题和设计缺陷。C++标准明确允许虚假唤醒,要求开发者必须使用循环检查条件。解决方案包括:1)使用while循环检查条件;2)采用带谓词的wait方法;3)精细化锁控制,确保修改共享状态时持有锁。关键点在于先修改状态再通知线程,并持续检查条件以避免误执行。正确应用这些方法可确保多线程程序的稳定性和正确性。
2025-08-31 18:45:36
634
原创 gcc常用优化等级详解
GCC编译器提供多种优化等级,包括-O1、-O2和-O3。-O1进行基础优化(如分支合并、常量折叠),编译快且便于调试,适合开发阶段;-O2在-O1基础上增加寄存器分配、循环展开等优化,性能和稳定性平衡,推荐用于生产环境;-O3采用激进优化(函数内联、循环向量化等),性能提升显著但风险较高,适合性能关键型任务。选择建议:调试用-O1,生产环境用-O2,高性能计算用-O3(需充分测试)。
2025-08-31 18:42:52
632
原创 linux中的ss工具及tcp参数详解
本文详细介绍了Linux系统中ss工具的使用方法及其输出的TCP连接内部参数。通过ss -i -t -p命令可查看TCP连接的详细信息,包括拥塞控制算法、窗口大小、往返时延等关键指标。文章重点解释了cwnd、ssthresh等参数在慢启动和拥塞避免机制中的作用,分析了重传和窗口调整策略,并提供了网络性能优化的关键指标。最后推荐了ss、proc文件系统、tcpdump等网络监控工具,帮助用户全面掌握TCP连接状态和网络性能优化方法。
2025-08-31 18:39:56
311
原创 tcp控制块icsk_ack详解
延迟 ACK (pingpong:用于减少 ACK 包数量,优化网络负载,但可能增加延迟。快速 ACK (quick:用于立即发送 ACK 包,避免延迟 ACK 带来的过高延迟。内核综合考虑网络状况、RTT、传输速率等因素,动态决定 ACK 的发送方式,以优化 TCP 性能。
2025-08-31 18:35:45
379
原创 kswapd工作机制详解
本文详细解析了 Linux 内核中的 kswapd 线程,该线程负责异步内存回收。文章从工作流程、唤醒机制和回收策略三方面展开:首先介绍其通过水位阈值管理内存状态,并利用 LRU 算法扫描活跃/非活跃链表;其次阐述被动唤醒(内存分配失败)和主动唤醒(周期性检查)两种机制;最后说明其回收范围确定、文件页/匿名页处理策略及动态调整过程。kswapd 的异步设计有效减少了直接回收的性能影响,但频繁活动可能暗示内存配置问题。文章还提供了相关监控工具建议。
2025-08-31 18:32:11
1029
原创 pgpgout pgpgin
本文解析了Linux内核中I/O统计与扇区大小的关系。Linux默认扇区大小为512字节,可通过blk_queue_logical_block_size调整。内核通过submit_bio函数提交I/O请求时会统计页级读写次数(pgpgin/pgpgout),统计单位与逻辑扇区相关。值得注意的是,这些统计数据反映的是内存页操作,而非实际磁盘写入量。此外,对于工作集读取,内核还会统计内存停顿时间用于PSI监控。
2025-08-31 18:27:24
250
原创 cpu温度对调度的影响
Linux内核通过**热压力(thermal pressure)**机制感知CPU温度变化导致的降频(throttling),动态调整任务调度。核心参数sched_thermal_decay_shift(取值范围0-10)控制热压力的指数衰减速率,值越大衰减越快。该机制在调度器周期性tick中更新,通过thermal_pressure = max_capacity - current_capacity公式动态计算CPU实际能力,避免过热CPU被过度分配任务,温度正常后逐步恢复调度能力。特别适用于ARM bi
2025-08-31 18:23:47
395
原创 Linux 内核收包流程与 epoll 回调触发机制解析
本文深入解析Linux内核网络收包与epoll回调机制,从硬件到用户态完整呈现数据流路径。首先介绍软中断注册机制,重点分析NET_RX_SOFTIRQ处理流程;然后详细阐述网卡驱动NAPI注册、poll函数调用及协议栈处理(IP/TCP层);最后揭示epoll回调触发原理:从socket可读事件通过wait queue唤醒,到ep_poll_callback将事件加入rdllist,最终唤醒epoll_wait。整个过程形成高效的事件驱动I/O模型,实现内核到用户态的无缝衔接。
2025-08-31 18:07:26
355
原创 vector的reserve为什么很重要
本文解析了std::vector的扩容机制。当容量不足时,会调用_M_realloc_insert函数:1)计算新容量(通常1.5-2倍增长);2)分配新内存;3)迁移旧数据(优先使用搬移构造);4)释放旧空间。扩容时间复杂度为O(n),但通过指数级增长策略使均摊复杂度保持O(1)。建议使用reserve()预分配容量以避免频繁扩容带来的性能损耗。
2025-08-31 18:02:17
273
原创 vector的swap高效的原因
std::vector::swap 的高效性源于其仅交换内部指针而非元素本身。通过交换三个关键指针(_M_start、_M_finish 和 _M_end_of_storage),时间复杂度为常数 O(1),无需内存分配或元素拷贝。这种设计依赖 vector 的实现层封装,确保接口稳定性的同时提升性能。前提是两个 vector 使用相同的分配器,否则可能引发问题。该机制体现了接口与实现分离的思想,使 swap 成为近乎零开销的操作。
2025-08-31 17:59:07
520
原创 vector clear的时候,内存发生了什么
std::vector::erase 和 clear 不会释放底层内存,仅销毁元素对象(调用析构函数),保持 capacity() 不变以便复用空间。特别地,元素若为指针,vector 不会释放指针指向的内存,需用户手动管理。该策略避免了频繁内存分配/释放,提升性能,但开发者需注意资源释放责任。对于非 POD 类型会调用析构函数,而 POD 类型则无操作。
2025-08-31 17:30:44
654
原创 std::move的正确打开方式
std::move是C++11用于实现移动语义的核心工具,本质是类型转换而非直接移动操作。它将左值转换为右值引用,提示编译器可触发移动构造/赋值,实现资源所有权转移而非深拷贝。典型应用场景包括容器元素转移、函数返回大对象、资源管理类操作等。使用时需注意:避免对const对象或基础类型使用;移动后对象状态不确定;函数返回值不应加const以免阻碍移动优化。参数传递应根据需求选择const T&(只读)、T&&(接管资源)或模板T&&(完美转发)。正确使用可显著提升性能,
2025-08-31 17:23:28
503
原创 switch高效的原因
本文对比了 switch、if-else 和其他分支方式的性能差异。switch 在 case 值连续时会被编译器优化为跳转表(O(1)),而 if-else 链最坏情况下是 O(n)。switch 对分支预测更友好,且无哈希计算等额外开销。建议:case 多且密集用 switch,稀疏或非整型用查找表,分支少用 if-else。性能要求高的场景优先选择 switch。
2025-08-31 17:18:26
563
原创 堆栈打印的原理
摘要:ELF地址解析与符号还原过程涉及编译、加载和运行时三个阶段。编译时生成符号表、重定位表和调试信息;加载时内核映射程序段到内存,动态链接器处理ASLR并计算load_bias;解析时通过进程maps确定模块,计算ELF内部地址后查询符号表和DWARF调试信息还原符号和源码。影响因素包括编译选项(-g、strip等)和栈回溯可靠性。核心公式为:elf_addr = runtime_addr - load_bias,通过偏移量定位函数名和源码行号。
2025-08-31 17:09:34
810
原创 接下来的一些安排
Linux内存管理核心包括伙伴系统(Buddy System)、Slab分配器、页表管理(Page Tables)和内存回收机制(kswapd)。优化内核对象频繁分配/释放的场景(如task_struct),通过预分配和缓存对象减少开销。Linux通过VFS(Virtual File System)抽象不同文件系统,如ext4、XFS。负责物理页帧的分配与回收,通过合并和拆分不同大小的连续页块(2^n页)来减少碎片。使用红黑树(rb_root)管理可运行进程,以虚拟运行时间(vruntime)为键值。
2025-08-30 23:52:48
337
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅