IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:IO

共 8 篇相关文章

IT 累计浏览 4,638

在Linux进行IO的正确姿势

很多C/C++程序员在做网络编程时,习惯使用封装好的库,却可能忽略了底层IO操作的一个常见陷阱。这篇文章指出,许多人对read()/write()函数的错误处理并不到位。 作者从一个典型的错误代码示例出发:检查返回值为-1或0就认为完成了处理。但这忽略了关键的errno判断,尤其是EINTR(系统中断)和EAGAIN(非阻塞IO暂无数据)这两种情况。文章进一步展示了,仅仅判断errno还不够,正确的姿势是将IO操作放在一个while循环中,以便在发生可恢复的中断时进行重试,而非直接退出。 文中强调,一个完善的IO处理逻辑必须能应对操作系统的瞬时状况,并结合了select/epoll等IO多路复用机制。最后,文章建议读者参考sim框架的开源代码,学习成熟的IO处理模式。

IT 累计浏览 3,544

linux调整swap大小

这篇讲的是在Linux系统里,当默认swap空间不足或需要优化时,如何动手进行调整。作者从两种最主流的场景出发,给出了清晰的实操路径:一是如果磁盘有剩余空间,可以直接新建一个独立的swap分区;二是使用更灵活的文件交换方式,比如用dd命令创建一个指定大小的文件,再通过mkswap和swapon命令将其激活。 文章详细演示了第二种方法的全过程:从计算文件大小(示例中32k扇区大小乘以8192个扇区得到256MB),到格式化,再到启用。特别贴心地指出了如何通过编辑/etc/fstab文件,让添加的swap分区或文件能在系统启动时自动加载,避免了每次都要手动操作的麻烦。 除了“怎么做”,文章也解释了“为什么”。它提到,swap空间通常建议不小于64MB,且大小为物理内存的2到2.5倍,但具体要根据服务器负载(如数据库、Web服务器)来调整。同时,使用多个swap区能分散磁盘I/O负载,提升交换效率,避免单个交换区过忙导致的系统卡顿——这往往是性能瓶颈所在,而非CPU问题。整篇内容步骤具体,原理清晰,对于需要管理Linux内存的运维人员或开发者来说,是一份很实用的指南。

IT 累计浏览 16,675

关于IO的同步,异步,阻塞,非阻塞

这篇讲的是网络IO模型中几个核心但常被混淆的概念:同步、异步、阻塞与非阻塞。作者从一次团队周会的实际讨论出发,发现大家对这些术语的理解各执一词,甚至连常见的技术资料(如Wikipedia)也常将“异步”与“非阻塞”混为一谈。 文章的核心价值在于对这两对概念进行了系统性的对比与澄清。它明确了“同步/异步”关注的是IO操作完成后,通知机制的差异——是由调用方主动检查,还是由内核完成后通知调用方;而“阻塞/非阻塞”描述的则是调用函数后,在数据未就绪时线程是否挂起等待。作者结合Unix系统调用和epoll的实例,分析了它们在不同网络编程模型下的具体表现与组合方式。 通过厘清这些理论上的区别,文章能帮助开发者更准确地理解`select`、`poll`、`epoll`以及异步IO接口(如`aio`)的设计思想与适用场景,这对于编写高性能的网络服务程序很有启发。

IT 累计浏览 4,190

梦幻西游服务器 IO 问题

这篇讲的是《梦幻西游》服务器遭遇的一场棘手IO故障。线上服务器突然出现响应延迟飙升,游戏内玩家频繁遭遇卡顿甚至操作失败。作者从监控告警切入,抽丝剥茧地分析了问题现场:系统日志显示磁盘IO等待时间异常高,但常规的CPU和内存指标却一切正常。 深入排查后,真正的元凶浮出水面——并非磁盘本身老化,而是某个后台日志收集模块在特定时间点产生了远超预期的突发写入量,瞬间占满了磁盘的IOPS配额。这个模块原本设计用于异步写入,但因其使用的缓冲队列在面临瞬间高并发时发生了阻塞,导致本该异步的日志操作意外拖累了主业务线程。 文章不仅定位了问题,更细致拆解了优化方案:通过为日志模块增加写入限流、调整缓冲队列策略,成功将磁盘IO负载削减了70%以上,服务器性能恢复如常。这个案例生动地提醒我们,在复杂的服务架构中,一个看似不起眼的辅助组件,其异常行为也可能像蝴蝶效应一样,最终引发核心业务的连锁故障。

IT 累计浏览 7,072

blktrace 深度了解linux系统的IO运作

这篇讲的是 blktrace 这个 Linux 下相对小众但极其强大的块层 IO 跟踪工具。作者没有停留在工具的基本用法上,而是深入讲解了如何利用它真正理解系统底层的 IO 流动。文章核心在于揭示 blktrace 与 iostat、perf 等更常见工具的区别:前者能让你像看地图一样,追踪一个 IO 请求从应用程序发起,经过文件系统、通用块层,最终到达具体设备的全过程,包括每个环节的耗时和队列状态。 作者详细展示了 blktrace 的输出格式和常用分析工具(如 blkparse、btt),并通过真实案例演示了如何从海量事件日志中,定位出“谁在何时对哪个设备发起了什么操作”、“IO 在哪个队列里排队过久”这类具体问题。这使得它在诊断复杂的 IO 性能瓶颈(如设备利用率高但响应慢)时,比仅能提供聚合统计信息的工具要精准得多。 文章最终将工具价值落到了实战层面:当你怀疑系统存在不规则的 IO 模式、需要优化特定应用的 IO 路径,或者想从根源上理解一次磁盘性能抖动的来龙去脉时,blktrace 提供的这种“逐帧回放”能力,能让排查过程事半功倍。

IT 累计浏览 3,653

极不和谐的 fork 多线程程序

这篇讲的是一个开发者如何被一个“诡异”的死锁问题坑到,最后发现罪魁祸首是在多线程程序里使用了 fork。文章从程序突然卡死、日志却毫无头绪的场景切入,抽丝剥茧地解释了问题的根源:fork 只会复制调用它的那个线程,而其他线程持有的互斥锁状态却无法被继承,这会导致子进程里永远等不到锁,直接死锁。 作者没有止步于解释“为什么不行”,更进一步探讨了“那该怎么办”。文章对比了几种常见的替代思路,比如利用 posix_spawn 或 exec 加上 pthread_atfork 来安全地创建子进程,并给出了清晰的决策路径:如果你需要新的进程执行全新任务,别 fork,用 posix_spawn;如果你必须 fork,那请确保在 fork 之后、exec 之前,立刻把其他线程创建出来。 全文最大的价值在于,它不仅点明了一个经典但易踩的陷阱,更提供了清晰的避坑指南和架构层面的思考,对那些需要在多线程环境下处理进程创建的开发者来说,是一次非常及时的提醒。

IT 累计浏览 3,765

oracle数据库的CPU/IO信息采集

这篇讲的是如何在Oracle数据库中系统化地采集CPU与IO性能指标。作者从实际运维需求出发,详细拆解了通过V$SYSSTAT、V$SYSTEM_EVENT等动态性能视图获取关键数据的方法,并给出了具体的SQL查询示例。文章不仅说明了如何抓取CPUTime、User IO Wait Time等核心时间统计,还深入解析了逻辑读、物理读等IO指标的采集逻辑。特别值得注意的是,作者将操作系统级监控与数据库内部视图相结合,形成了完整的监控闭环,为性能瓶颈定位提供了清晰的量化依据。整篇内容扎实,可操作性强,对于需要构建Oracle监控体系的DBA而言,是一份能直接落地参考的技术指南。

IT 累计浏览 3,202

浅谈数据库系统中的cache

这篇讲的是数据库系统中容易混淆的两个核心概念:Cache 与 Buffer。作者开篇就点明了本质区别:Cache 旨在加速“读”,通过缓存从磁盘读出的数据来避免频繁I/O;而 Buffer 旨在缓冲“写”,暂存待写入磁盘的数据以合并或延迟操作。一个解决读性能问题,一个解决写平滑问题。 文章也指出,在实际工程与术语使用中,两者常被混合称为“Buffer Cache”,界限并不总是泾渭分明。因此,本文后续的讨论统一将这类混合读写缓存统称为“Cache”。这种处理方式反映了技术概念在落地时的灵活性,也引导读者聚焦于缓存机制本身如何优化数据库性能,而非拘泥于名称的严格区分。 理解这种基础概念的差异与关联,是深入探究数据库性能优化、存储引擎设计的第一步。对于想要弄清系统底层为何如此设计,以及如何在实际场景中评估缓存策略的开发者而言,这篇文章提供了一个清晰的概念起点。