- 博客(394)
- 资源 (11)
- 问答 (1)
- 收藏
- 关注
原创 线程池阻塞问题的思考与改进
本文讨论了线程池中处理阻塞任务的解决方案。当30%的任务可能永久阻塞时,使用单一线程池会导致线程资源耗尽(5线程池仅处理19个任务后阻塞)。改进方案是将阻塞任务单独提交到专用的阻塞IO上下文(如asio::io_context),确保主线程池(处理CPU密集型任务)不受影响。实验结果显示,50个任务中42个CPU任务正常完成,8个阻塞任务被隔离处理,验证了该方案的可行性。这种设计模式有效解决了阻塞任务影响整体系统吞吐量的问题。
2026-03-06 23:15:00
41
原创 关于Ceph的一致性分析
本文对比分析了二阶段提交(2PC)和Ceph的写流程。2PC中主节点并行执行本地写日志和向从节点发送消息,等待所有从节点确认后提交或回滚,存在多轮消息交互的复杂性。Ceph采用类似流程但更简化:主节点并行执行本地写和发送写请求,只有所有节点(包括主)都成功才确认写操作,否则直接返回失败。Ceph在事务提交阶段遇到存储错误时会崩溃退出,确保数据一致性。两种方案都通过主从协作保证强一致性,但Ceph流程更简洁高效。
2026-02-02 10:23:02
353
原创 为什么高性能代码爱用侵入式链表?一个 pool[10000] 的例子让我彻底明白了
本文对比了普通链表和侵入式链表的实现差异。普通链表需要额外创建节点结构体,存在内存分配、指针跳转和内存释放的开销。侵入式链表通过将指针直接嵌入Person结构体中,避免了节点分配,访问更高效且无需单独释放。其优势在于零分配、一次访问和自动管理,但会带来耦合问题和生命周期风险。适用于预先分配对象、频繁组织且要求高性能的场景。侵入式链表在特定场景下能显著提升性能,但需谨慎处理耦合和生命周期问题。
2026-01-29 20:30:53
368
原创 linux测速
摘要:本文介绍了三种Linux测速方法,推荐使用wget直接下载大文件测试网速,简单直观。其他工具如speed-test因测试节点在国外不准确,fast-cli安装复杂且依赖项多容易失败。wget是最便捷有效的测速选择,命令示例为wget -O /dev/null [文件URL]。
2026-01-27 17:51:25
151
原创 Ceph性能瓶颈梳理与应对方案
最近在做ceph相关的工作,很多特性都和ceph的性能相关。做了一段时间了,记录一下心得,希望帮助到有需要的朋友。主要应对的是对象存储的场景。索引分片按照三副本存储在index池,用户数据EC存储在data池。题目启的很大,但是实际上主要是分析硬盘瓶颈的解决方案。
2026-01-27 01:15:00
580
原创 关于Rocksdb多列簇下写压力不一致带来的问题
本文分析了RocksDB中列簇压缩调度的公平性问题。当前系统采用简单的FIFO队列调度方式,导致写入负载高的列簇无法及时获得压缩资源。通过案例说明,当不同列簇的写入速率差异较大时(如A列簇写入量是其他列簇的4倍),简单的轮转调度会导致高负载列簇积压严重,甚至触发写入停滞。作者指出真正的公平调度应该基于各列簇的紧急程度(通过score评估),建议改为优先调度score最高的列簇。这一问题的核心在于认识到绝对公平与效率优化的矛盾,发现问题本身比具体解决方案更为关键。
2026-01-20 19:16:29
47
原创 说说CompactionPri
RocksDB在6.15.5版本中提供了四种选择待compact文件的策略:kByCompensatedSize根据文件补偿大小排序,会考虑墓碑键值的影响;kOldestLargestSeqFirst和kOldestSmallestSeqFirst分别基于SST文件中最新和最老数据的序列号来选择;kMinOverlappingRatio则优先选择与下层SST文件交叠比例小的文件。其中kMinOverlappingRatio是该版本的默认策略,通过计算当前文件与下层文件的KV范围交叠比例来决定压缩优先级。这些
2026-01-20 11:42:07
330
原创 使用Ventoy安装FnOS
Ventoy是一款多功能U盘启动工具,支持同时存放系统镜像和个人文件。安装时需下载Ventoy安装包,运行Ventoy2Disk.exe格式化U盘为exFAT格式,然后将系统镜像拷贝至U盘根目录。使用时需通过BIOS设置U盘为第一启动项,选择系统镜像安装。安装过程中要注意为系统分区预留空间(建议80-90GB),不能全盘分配,以便后续创建存储空间。安装完成后拔掉U盘即可启动新系统。该工具支持版本升级且不会影响U盘中的个人文件。
2025-12-05 22:54:53
452
原创 c++锁的基本用法
本文展示了两种多线程同步机制的C++实现。第一部分实现了生产者-消费者模型,使用互斥锁和条件变量来同步对有限容量篮子(10个鸡蛋)的存取操作,确保生产者在篮子满时等待,消费者在篮子空时等待。第二部分实现了读写锁(RWLock),通过维护读者、写者和等待写者的计数,使用条件变量协调读写操作,确保写者优先避免饥饿,同时允许多个读者并发访问。两个示例都提供了完整的线程测试代码,演示了如何在并发环境中安全地共享数据。
2025-12-03 09:32:16
110
原创 通过sunshine+moonlight在客厅的电视上玩书房里电脑上的游戏
摘要:本文介绍如何通过Sunshine和Moonlight实现电脑游戏在客厅电视上串流播放。具体步骤:1)电脑安装ViGEmBus驱动和Sunshine服务端;2)电视安装Moonlight客户端;3)手柄连接提供两种方案:蓝牙直连电视(仅游戏内可用)或2.4G接收器连接电脑。作者推荐使用蓝牙连接电视的方案,并指出多手柄情况需要自行测试。全文采用直白表述,避免常见教程关键信息缺失的问题。(149字)
2025-12-01 00:15:27
563
原创 ceph搬迁的时候压力汇总情况
摘要 本文介绍了一个用于分析Ceph集群数据迁移压力的Python脚本。该脚本通过解析ceph pg dump命令输出,统计各OSD节点在数据迁移过程中的读写压力。主要功能包括: 统计待迁移数据(backfill_wait)和正在迁移数据(backfilling)的分布情况 计算各OSD作为源节点(发送数据)和目标节点(接收数据)的PG数量 提供三种压力视图:发送压力、接收压力和总迁移压力 输出结果按压力降序排列,便于识别高负载节点 使用方式简单,只需通过管道将过滤后的PG信息传递给脚本即可。该工具弥补了原
2025-11-28 18:04:00
194
原创 鼓捣4k仓库(一个旧手机,帮你打造4K观影天堂)
摘要:本文介绍了如何利用闲置的旧手机搭建家庭下载服务器,实现远程控制下载4K电影并本地观看。通过Termux安装Aria2下载工具,配置内网穿透使用frp服务,解决了远程操作、低功耗下载和本地观看三大问题。文中详细记录了从环境配置、Aria2安装、内网穿透到实际下载的全过程,提供了一种经济高效的影音下载解决方案,避免在线观看时的画质压缩问题。
2025-11-19 22:00:52
396
原创 聊聊c++的反射
本文探讨了C++中实现反射功能的几种方法。首先介绍了反射的基本概念,即通过字符串动态修改实例字段的能力。然后分析了RTTR框架的局限性,指出其已多年未更新且与高版本GCC兼容性差。重点介绍了两种实用方案:一是使用boost.pfr库进行字段索引访问,但存在只能通过常量索引访问的限制;二是基于nlohmann/json库的JSON序列化方法,通过模板函数实现了通用的字段修改功能,支持多种数据类型转换,虽然性能不高但足够满足一般需求。文章最后展示了这两种方法的具体实现代码示例,包括对Person和Config结
2025-11-10 17:50:09
201
原创 说说c++的异步 聊聊async_completion
我们从https://blog.csdn.net/dlf123321/article/details/154187272 看完,从流程上来说就走进了异步的大门。
2025-11-03 11:25:54
300
原创 c++ 关于全局变量
总感觉自己c++基础知识很差。最近看代码看到全局变量。我是这么想的。我定义一个global.h里面有一个int a=10;某个cc文件想用这个全局配置,就include globa.h 就行么。额,报错 multiple definition。那么怎么办呢?
2025-09-26 15:40:34
241
原创 关于Unix Domain Socket的使用入门
Unix Domain Socket(UDS) 是一种 在同一台计算机上的不同进程之间进行通信的机制。你可以把它理解为“本地版的网络套接字”,但它不走网络,只在操作系统内部完成数据交换。简单说一个c++每隔几秒钟打印一个字符串,这个字符串就存在进程的内存里,并不是从磁盘里实时读取的。现在想让程序打印另一个字符串怎么办?最近在看ceph的动态参数修改。就观察到了Unix Domain Socket这个技术。假定我有个c++程序,里面有个变量,我现在想修改它怎么办?那这个UDS具体是个啥呢?
2025-09-26 15:02:48
326
原创 关于shared_ptr的线程安全性
本文讨论了shared_ptr的线程安全性问题。指出多个线程同时读写同一个shared_ptr变量是不安全的,会导致"撕裂读"等问题。但不同线程持有指向同一对象的独立shared_ptr拷贝时,引用计数操作是线程安全的。然而,这并不保证对象内部的数据安全,若多个线程同时修改对象仍需加锁。此外,文章还对比了unique_ptr的使用方式,强调必须通过std::move转移所有权。总之,shared_ptr的线程安全是有限的,需根据具体使用场景采取适当措施。
2025-09-19 14:29:47
93
原创 关于使用netserver 进行网络速度的测试
1 在server A上启动 netserver 这个程序;端口,就随便写一个不用的值,这里就暂时用88882 在server B上去进行测试,假定server A的ip是192.168.1.1053 在server A上查看网络流量,就可以看到192.168.1.105绑定的网卡上有流量,另外这个流量的计算单位是KB/s,或者MB/s。记得是大B。4 测试完成关闭server A上面的netserver然后 kill5 测试完成关闭server B上面的netperf。
2025-06-22 19:25:30
321
原创 关于sst的统计信息
不是,使用的是 FdWithKeyRange(就是上面的VersionStorageInfo里面的level_files_brief_)即使我们配置单个sst的大小是64MB,L1L2及更下层次的sst最大大小确实是64MB,但是L0层的sst并不受这个限制。下一个问题,在compact进行选择文件的时候,使用的是FileMetaData么?VersionStorageInfo里面的files_的语意说的很清楚了。Version 记录的某个时刻全局所有sst的信息。记录在sst内部的属性信息。
2025-06-17 11:05:32
392
原创 char* Slice的引用拷贝管理
因为org的清理,只是说让org内部不在指向0x4070a3 ,但是0x4070a3的数据(abc)依然没有被覆盖,而且another依然指向0x4070a3。data_ 本身是一个字符指针,指向0x40709a ,这个位置存放的数据是“abcx\0”data_ 本身是一个字符指针,指向0x40709f,这个位置存放的数据是“defx\0”org和another指向同一个位置,那为什么清理了org,another依然可以读到呢?因为slice_list里面的每个元素的data都指向temp2。
2025-06-09 14:32:16
313
原创 RocksksDB写流程
batch里面有个字符串叫rsp_,里面放的就是每次操作的元数据,rsp_ 的格式如下|8个字节的sequence|4个字节count|serialized-kv-1|serialized-kv-2|serialized-kv的结构就是|1个字符的KTypeValue|4个字节key_size|key_bytes|4个字节value_length|value_bytes|所谓的KtypeValue就是表明这次操作是写还是删除。
2025-06-05 15:24:53
873
原创 谈谈iostat
这个简单的可以理解为快递员要给一个18层的公司所有员工送快递,每一层都有一些包裹,对于快递员来说,最好的办法是同一楼层相近的位置的包裹一起投递,否则如果不采用这种算法,采用最原始的来一个送一个(即noop算法),那么这个快递员,可能先送了一个包括到18层,又不得不跑到2层送另一个包裹,然后有不得不跑到16层送第三个包裹,然后包到1层送第三个包裹,那么快递员的轨迹是杂乱无章的,也是非常低效的。aqu-sz: 发出到设备的请求的平均队列长度。w_await 向设备发出的写请求被处理的平均时间(以毫秒为单位)。
2025-05-28 22:02:49
644
原创 关于甲骨文(oracle cloud)丢失MFA的解决方案
前两年,申请了一个招商的多币种信用卡,然后就从网上撸了一个oracle的免费1h1g的服务器。用了一段时间,人家要启用MFA验证。啥叫MFA验证,类似与短信验证吧,就是绑定一个手机,然后下载一个app,每次登录的时候除了你设置的用户名密码外,还需要那个特定手机上展示的一个code。就这么简单。但是,不出意外的话,有意外了,手机换了,当时忘记更新那个app了。然后 就没法登录oracle了。
2025-05-10 17:05:52
2286
原创 c++ stl的插入获取与删除
本文介绍了常用STL容器的基本操作和特性。list底层采用双向链表实现,支持高效的头部/尾部插入删除操作;vector底层为数组,头部操作时间复杂度为O(n)。文章详细列出了list和vector的常用方法对比,包括元素增删和访问操作,并提供了删除特定元素的代码示例。此外还简要说明了stack和queue的基本操作,如push/pop、top/front等。重点比较了emplace和push方法的区别,emplace可直接构造元素避免拷贝。
2025-04-21 10:36:12
403
原创 关于LRU与LFU
第一个unordered_map key是真实的key,value是一个node,包含了真实的value和它使用的频率。简单地说,就是移除那些最长没有被使用的数据。当容量满的时候,直接从第三个unordered_map 里面找最小的key,然后清理对应的value即可。第一个unordered_map key是真实的key,value是真实的value。第二个unordered_map key是真实的key,value 是它的使用次数。这里麻烦的要记录每个key的使用频率,然后找到最小的那个频率。
2025-04-10 14:48:18
466
原创 c++ vector指针的传递
当vector里面是指针,且整个vector作为参数传递给某个方法的时候。大家看上面的输出,比对一下 就能看出来很多问题。在linux下运行代码,上面两个地址是一样的;在windows下运行,上面两个地址不一样。
2025-03-18 22:04:15
317
原创 c++参数传递概念
p本身的地址是 0x7ffe35a67738 这个地址里面存放的是数据是0x7ffe35a67790,我们通过类型可以知道它依然是一个地址,在method3内部,我们就知道 0x7ffe35a67790 位置是一个person对象,那么是zhangsan。Person里面有个方法叫add,参数是Person *p,那么对p的所有修改,会影响真实的外部调用 这叫使用指针做函数参数。形参的地址自然是不变的,依然是0x7ffe35a67738 ,但是里面存的值就指向了new的那个对象了。
2025-03-16 00:36:41
137
原创 谈谈Libaio
但是 我找了半天 都没有一个能运行的例子。一段代码不能运行和shi有什么区别?下面的例子是直接把一个person list写入裸盘,再读出来进行校验的例子。网络上有一堆 aio的例子和说明。
2025-02-17 17:03:26
245
原创 线程池判断当前任务组是否都已经结束
最近写测试代码的时候,需要判断提交的线程池里面的任务是否都已经全部执行完成。在网上找到了一圈,发现这篇博客写到算是比较完整的。但是还是有几个问题。
2024-12-08 20:43:47
214
原创 rocksdb merge的简单记录
rocksdb的merge主要是为了解决读&写需要两步的操作。例如定义一个累加器,总得先把之前的值读出来才能加。下面给两个例子,大家可以直接用。
2024-10-10 17:56:14
476
原创 fio的常用命令
使用fio工具测试磁盘性能时,必须注意:写测试只能在未挂载文件系统的裸盘上进行,已挂载且有数据的磁盘不能直接测试。顺序写测试使用5GB文件,参数包括direct I/O、32队列深度、4K块大小;顺序读测试类似,但可设置多线程。测试命令需指定设备路径(如/dev/sdxxxxx)和测试名称。
2024-09-24 16:32:02
222
fusioncharts/widgets for flex 的swf 与swc文件
2012-11-28
springmvc 异常处理示例
2016-02-27
用java发送邮件
2014-09-09
Collections.sort的源码问题
2015-03-03
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅