自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 fflush的实现源码解读

当我们使用file的时候。

2025-08-31 16:57:44 1052

原创 接下来的一些安排

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

原创 glibc的回收策略源码解读

glibc中的malloc分配策略源码解读

2025-08-30 23:39:24 1145

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除