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

DevOps

共 871 篇文章

IT 2013-09-23 12:27:57 / 累计浏览 3,496

Linux内核代码中的脏话统计

这篇讲的是作者从一个已停更的“the linux kernel fuck count”项目获得灵感,对Linux内核的C、H及汇编源代码进行了一次系统的脏话统计分析。作者按版本号,分别从脏话的绝对数量和代码行的脏话密度两个维度绘制了图表。 数据呈现了一个有趣的趋势:从2.4版本开始,脏话的绝对数量显著攀升。然而,考虑到同期内核代码总量也在激增,折算下来,平均每行代码的“脏话密度”反而是在下降的。文章坦诚地分享了统计方法的局限,比如会将词中包含的词也计入,以及受FreeBSD正则引擎内存泄漏的影响未能优化。 作者最终开源了统计脚本,但也自嘲其代码质量混乱。这本质上是一次用独特视角审视开源社区文化的趣味实践,既看到了开发者情绪的外露,也反映了代码库膨胀带来的稀释效应。

本机暂存
IT 2013-09-15 22:39:34 / 累计浏览 1,939

敏捷就是“团队快乐”

这篇讲的是敏捷的核心在于“团队状态”,而非机械执行流程。文章直面传统职能组织中“各扫门前雪”的协作困境,指出目标冲突导致相互推诿的痛点。 作者将真正的敏捷拆解为四个支柱:一是“团结一致”,团队共享同一目标,必要时主动补位,比如产品与技术共同细化需求、开发介入测试;二是“纪律严明”,角色分工、每日站会、可视化工具是为协作服务的清晰约束,而非推责的规矩;三是“快速反应”,摒弃“憋大招”的完美主义,通过小步快跑的迭代(如两周一个版本)尽早交付价值、获取用户反馈;四是“乐在其中”,让成员在消灭任务卡片、并肩作战的即时反馈中获得成就感与快乐。 文章最后强调,快乐不是结果,而是敏捷实践的驱动力。高效协作与积极心态形成的良性循环,才是团队能持续适应变化、交付价值的根本。

本机暂存
IT 2013-09-02 13:30:13 / 累计浏览 3,738

关于Rsyslogd 的一些配置 (高性能、高可用 rsyslogd)

这篇讲的是作者公司日志传输服务器因带宽调整引发的日志堵塞实战。他们遇到的情况是,业务通过PHP syslog接口写日志时被“卡住”了,根源在于rsyslog默认配置追求“不丢任何数据”,但当传输链路异常时,队列堆积反而拖垮了业务。 排查发现,原有配置仅有基础传输逻辑,进程、队列、传输效率等关键参数全部使用了默认值。这种配置在理想环境下能运行,一旦出现网络波动或突发流量就暴露出问题。文章分享了如何通过调整队列参数来破解困境:例如定义`$MainMsgQueueFilename`和`$MainMsgQueueMaxDiskSpace`来控制磁盘队列大小,利用`$QueueHighWatermark`触发磁盘存储,并通过`$MainMsgQueueDiscardMark`与`$MainMsgQueueQueueDiscardSeverity`配合实现有策略的消息丢弃,避免业务被阻塞。 作者还附上了关键配置的截图和几份深入阅读的官方文档,特别是关于rsyslog队列机制的那篇。此外,文末也提及了RELP(可靠事件日志协议)等更健壮的传输方案,以及社区开发的syslog-safer工具作为补充。这是一次从故障现象到配置调优的完整经验梳理,对于使用rsyslog的日志架构很有参考价值。

本机暂存
IT 2013-08-15 12:53:50 / 累计浏览 2,527

想法与方法

这篇讲的是“想法与方法”之间常被忽略的鸿沟。作者从一个经典的寓言切入:一群老鼠讨论如何在猫脖子上挂铃铛以避险,主意虽妙,散会后却无人能执行。这个故事尖锐地指出了我们在工作中的一个常见陷阱——我们常常不缺天马行空的想法,甚至头脑风暴能产出无数点子。 文章的核心观点在于,真正的价值不在于提出多少点子,而在于冷静地区分哪些是当下可做的、哪些还纯属空想。靠谱的团队成员,应该帮助集体认清现实:明确手头的资源、可以借助的外力,以及最终能达成的实际绩效。作者强调,一个人的错误判断,可能拖累整个团队的努力。 对技术人而言,这提醒我们,在追逐新技术或设计新方案时,光有“好主意”不够。深入评估可行性、清楚边界条件,并与团队坦诚沟通,才是让创意真正落地、推动项目前进的关键。

本机暂存
IT 2013-08-14 13:36:29 / 累计浏览 1,454

互联网学习型敏捷研发组织的构建及策略

这篇讲的是如何为大型互联网系统打造一个真正敏捷的研发组织。作者一玄犀利地指出,许多团队深受传统瀑布模型影响,错误地将“流程”置于“人”之上,试图用“精密”的官僚流程把开发者当作流水线上的机器来管理,这恰恰忽视了软件开发中水面下的关键因素——“人和组织”。 文章主张,高效的敏捷团队必须摒弃命令控制文化,转向扁平、开放、自组织的学习型组织。作者将成功所需的能力分为两层:表层的“硬”技能(产品设计、快速开发、系统运维、社区运营),以及更底层的“软”能力,即组织持续学习、反思调整和团队协作的能力。 实现这一点的关键在于重构团队模式——从按职能分割转向按功能划分的跨职能小团队。团队内部自组织、高度自律,共同对项目负责。与之匹配的管理风格也应是“领导-协作式”而非“命令-控制式”:管理者需像教练一样,聚焦客户价值、清除障碍、培养个体、并营造一个鼓励交流与反思的环境。 最终,一个真正具备学习能力的组织能够自适应地选择和实践最适合自身的敏捷方法,让优秀的产品自然地从团队中涌现出来。

本机暂存
IT 2013-07-31 12:51:39 / 累计浏览 3,143

vi 编辑文件时"Terminal too wide"问题的解决

这篇文章讲的是使用vi编辑器时遇到的一个经典问题——在终端执行vi命令后,突然弹出一行“Terminal too wide”报错,导致无法正常编辑。 作者从实际遇到的这个报错场景切入,指出了问题的根源:这是由于终端环境的默认列数(columns)设置超过了某个平台允许的最大值。例如,在作者的电脑上,通过 `stty -a` 命令可以看到默认设置了171列。当通过SSH等方式连接到远程主机,或在特定环境下,这个过大的列数设置就会触发vi的保护机制,拒绝打开文件。 解决方法其实非常直接:在出现报错的终端中,运行 `stty columns 132` 命令,将列数调整到一个安全的范围内(比如常见的132列),然后再尝试用vi打开文件,问题即可解决。文章也提到,用户可以进一步修改本地终端的缺省列数设置以避免此问题反复发生。这是一个典型的、由终端环境配置不兼容引发的小麻烦,解决它只需一行简单的命令。

本机暂存
IT 2013-07-30 13:50:50 / 累计浏览 8,568

找回linux丢失的磁盘空间

这篇讲的是服务器磁盘空间莫名“消失”的一次典型排查。作者发现 `df` 命令显示磁盘使用率接近 100%,但用 `du` 统计具体目录占用时,两者结果却相差甚远,这显然不正常。 在排除了常见的“挂载点覆盖”问题后,作者将矛头指向了另一个经典场景:已删除的文件仍被进程占用,导致其占用的空间无法释放,且 `du` 也统计不到。通过 `lsof | grep deleted` 命令,果然揪出了一个躲在后台、持续写入的巨大日志文件。 解决方法很直接:终止那个持有文件句柄的进程,磁盘空间随即开始逐步释放。重启该进程后,日志也恢复正常写入。整个过程清晰地展示了 Linux 下磁盘空间“丢失”的一个常见原因及其高效定位与解决方法,对于运维人员非常有参考价值。

本机暂存
IT 2013-07-29 23:17:18 / 累计浏览 6,474

Linux下如何知道文件被那个进程写

这篇讲的是一个运维中常见的棘手场景:Linux下文件持续增长,但用lsof等工具却找不到对应的写入进程。作者从一位同学的实际困扰出发,指出问题的普遍性,并给出了一个基于内核视角的解决方案。 核心思路是,既然用户态工具难以追踪(可能是进程很快打开又关闭了文件),那就直接在内核的虚拟文件系统层进行监控。文章推荐使用SystemTap工具包中的inodewatch.stp脚本,它通过探测vfs.write事件,能根据文件所在的设备号(major/minor)和inode号,精准定位到正在执行写操作的进程。 作者随后用一个生动的实验进行了演示:用dd命令在后台持续写入一个测试文件,通过stat命令获取其inode和设备信息,然后运行stap脚本。终端立刻输出了正在执行vfs_write的dd进程信息(进程名、PID),瞬间“破案”。整个排查过程清晰直观,展现了SystemTap在内核级故障排查中的强大能力。

本机暂存
IT 2013-07-29 22:54:55 / 累计浏览 2,036

自动增量升级方案的设计及实现

这篇讲的是如何通过一套轻量级Shell脚本,实现业务应用(尤其是Web项目)基于SVN版本库的自动增量升级。 文章开篇直击痛点:运维与开发人员常面临增量升级时文件拷贝遗漏、rsync无法执行自定义脚本、手工编写升级脚本效率低下且易出错等问题。作者对比了几种常见方法后,提出了一种更优的方案——自动增量升级。 其核心思路分两步走。第一步是打包,开发人员执行`gen_manifest.sh`自动生成从版本库中导出的增量文件清单,经人工检查、修剪并可添加自定义脚本(如重启服务)后,由`gen_patch.sh`生成升级补丁包。第二步是升级,运维人员执行`patch.sh`应用补丁,该脚本会自动备份变更文件并执行清单中的定制操作,出现问题时可快速回滚。 方案的最大优势在于完全自动化和高度可定制。它无需额外工具,仅靠几个脚本就完成了从差异分析、打包到升级、回滚的闭环,并通过可插拔的方式支持升级时自动执行服务重启等运维操作。作者在文中提供了完整的脚本下载地址与清晰的三步操作流程(生成清单、生成补丁、执行升级),将一套设计思想落地为可直接使用的工具,切实解决了一线开发运维的繁琐负担。

本机暂存
IT 2013-07-28 15:51:11 / 累计浏览 6,048

Bash如何取得当前正在执行的脚本的绝对路径?

这篇讲的是Shell脚本中一个看似简单却容易掉坑里的问题:如何可靠地获取当前执行脚本的绝对路径。 作者从实际开发中经常需要使用脚本自身路径的场景出发,重点澄清了两种广为流传但并不正确的“常见误区”。一个是直接使用 `pwd` 命令,它只能获取当前的工作目录,与脚本所在位置无关;另一个是过度依赖特殊变量 `$0`,它的值会随 bash 的调用方式而变化,不一定就是脚本的绝对路径。 文章的核心价值在于对比和辨析。它详细解释了为什么这些方法会失效,并给出了一个经过验证的正确解决方案:`basepath=$(cd \`dirname $0\`; pwd)`。这个方案通过组合 `dirname` 和 `cd` 再加上 `pwd`,巧妙地规避了 `$0` 可能不完整的问题,确保无论从哪个目录调用脚本,都能稳定地返回脚本自身所在的绝对路径。对于编写需要灵活部署、不依赖用户预配置的工具脚本来说,这个技巧非常实用。

本机暂存
IT 2013-07-26 13:25:46 / 累计浏览 4,348

服务器监控软件Zabbix初窥

这篇讲的是作者从工作中对服务器监控系统的兴趣出发,初次探索了开源监控软件Zabbix的体验。Zabbix始创于2001年,使用C语言和PHP开发,以GPL v2开源发布,经过十多年积累已形成成熟的解决方案。 作者详细描述了安装过程:从SourceForge下载源码包,按照官方Wiki配置后直接make install,整个过程出乎意料地简单顺畅,比以往编译其他软件轻松得多。前端安装也不复杂,类似WordPress的配置。文章接着解析了Zabbix的核心概念:通过host group分组管理主机,定义item监控属性(如CPU、内存、网络流量),设置trigger触发规则(例如CPU超过90%报警),并基于events触发通知,支持邮件、短信、微信等多种方式,逻辑严密且功能全面。 在对比层面,作者将Zabbix与所在公司的内部

本机暂存
IT 2013-07-15 13:25:03 / 累计浏览 6,711

Linux下CPU的利用率

这篇讲的是如何真正理解Linux系统下CPU时间的构成,从而看懂利用率背后的含义。文章从内核时间基础切入,解释了HZ(时钟中断频率)、tick(中断间隔)和jiffies(中断累计次数)这几个关键概念,为你打下理解的底子。 核心部分是将CPU时间拆解得明明白白:它并非一个整体,而是由用户态(User time、Nice time)、内核态(System time、Hardirq time、Softirq time)以及等待(Waiting time)、空闲(Idle time)和虚拟机偷取(Steal time)时间共同组成。文章直接给出了计算公式,让你能一一对应`top`命令输出中那些让人困惑的`%us`、`%sy`、`%id`等百分比,原来它们分别代表了不同时间段的占用情况。 作者最后指明,`top`、`iostat`、`vmstat`这些常用工具的数据源头都是`/proc/stat`文件,其中的时间单位就是tick。搞清楚这些组成,当看到系统卡顿时,你才能从高企的`%sy`判断是内核子系统瓶颈,还是从高`%wa`看出是I/O等待拖了后腿,让性能分析有据可依。

本机暂存
IT 2013-07-07 22:21:02 / 累计浏览 2,804

集群资源调度系统简介与galaxy资源调度系统简介

这篇讲的是集群资源调度系统,它为什么重要,以及内部的一个具体实践。 随着公司集群规模扩大,资源利用率低和部署运维复杂成了迫切需要解决的问题。文章从IaaS的角度切入,指出资源调度系统的核心价值在于实现资源共享、弹性管理与自动化运维。作者从谷歌Omega论文出发,梳理了三代调度架构的演进:从结构简单但扩展性差的中央式调度器,到支持大规模集群和多框架混部的双层调度器(以Mesos为代表),再到通过全局共享状态和乐观锁提升并发性能的第三代架构。文中以Mesos的“Resource Offer”机制为例,清晰展示了资源如何分配给具体应用。 文章后半部分将视角转向内部实践。为了支撑“万”级别流计算任务并解决现有引擎在大集群、多租户下的瓶颈,galaxy平台设计了一套轻量级的双层调度系统,目标是实现多集群间的资源共享与任务隔离。这篇不仅梳理了技术脉络,也展示了如何从通用架构中汲取灵感,解决实际业务中的资源调度挑战。

本机暂存
IT 2013-06-19 22:51:15 / 累计浏览 6,925

Linux知识:为什么要用字符~来表示home目录

这篇讲的是Linux和Unix系统里一个常见却很少有人深究的细节:为什么用波浪号“~”来表示用户的home目录。答案其实藏在一段计算机硬件的历史里——这个用法直接沿袭自1970年代流行的Lear-Siegler ADM-3A终端机。 文章指出,在这种老式终端上,波浪号“~”键与“Home”键(将光标移至行首)被设计在同一个物理按键上。当Unix系统的开发者需要为home目录找一个便捷的符号表示时,这个现成的、含义紧密相关的按键自然就成了首选。因此,今天我们敲下的“cd ~”,其根源竟是一次跨越数十年的硬件设计传承。文章还配上了该终端机及其键盘布局的实物照片,让这段冷知识变得直观可感。了解这个小小的起源,能让我们对命令行中看似“理所当然”的设计多一分会心一笑的理解。

本机暂存
IT 2013-06-19 22:29:42 / 累计浏览 5,145

正确用DD测试磁盘读写速度

这篇讲的是如何正确使用dd命令测试磁盘读写速度。作者从四种常见的dd测试命令写法出发,对比了它们之间一个关键但容易忽略的差异:对系统写缓存的处理方式。 文章指出,最简单的dd命令(`dd bs=1M count=128 if=/dev/zero of=test`)其实并没有把数据真正写到磁盘上,它只是将数据读入内存缓存,因此得出的速度“超级快”但毫无参考价值。即便在命令后加上`; sync`,由于sync是独立执行的,在开始同步写入前dd早已显示了“假”速度。 真正的区别在于两个参数:`conv=fdatasync` 与 `oflag=dsync`。前者会在dd执行完毕后进行一次完整的同步操作,确保数据落盘,从而测出相对真实的、结合了读写缓存的持续写入性能;后者则强制每次写入1MB数据后都进行同步,几乎完全绕过缓存,模拟的是最慢的、无缓存优化的随机小文件写入场景。 因此,对于评估磁盘的常规读写性能,作者建议使用 `conv=fdatasync` 参数,这样测得的数据最贴近实际工作负载。理解这些细微差别,能帮助我们避免被虚高的测试数据误导,更准确地评估存储子系统的真实性能。

本机暂存
IT 2013-06-18 13:49:07 / 累计浏览 2,220

各就各位,各司其职

这篇讲的是团队中战略与执行如何配合的真实案例。作者从与CEO John和行政负责人Grace的对话切入,呈现了一个看似简单的outing决策背后的复杂落地过程。 John作为领导者,从体验和团队士气出发,直接指出台湾是绝佳选择,忽略了一切执行细节。而Grace作为执行者,则清晰地列出了针对100多人团队的户籍差异、复杂的商务签证流程以及漫长的时间成本。两人的视角截然不同,但又缺一不可——没有John的远见,团队可能永远走不出本地;没有Grace对细节的把握,目标永远只能是纸上谈兵。 文章的核心观点正在于此:一个目标的实现,既需要有人“抬头看路”指明方向,也需要有人“低头拉车”解决具体问题。两者相互体谅、各司其职,才能将看似不可能的任务变为现实。这不仅是项目管理的关键,也是任何高效团队的运作基石。

本机暂存
IT 2013-06-17 23:57:16 / 累计浏览 6,889

Linux探索:一次删除一百万个文件的最快方法

这篇讲的是如何在Linux系统下极高效地删除海量文件。作者从一个Quora上的讨论出发,对几种常见的批量删除方案进行了系统性的速度对比。 文章的核心发现令人意外:通常用于数据同步的`rsync`命令,在删除任务中表现极其出色。作者通过两次测评(第二次使用了新硬件和更精确的计时工具)发现,使用`rsync --delete`将一个空目录与目标目录同步,可以在10秒内删除100万个文件。相比之下,传统的`find -delete`、`find | xargs rm`以及直接使用`rm -rf`,耗时都在28秒到41秒之间,性能差距明显。 这种高效的背后,是`rsync`直接操作文件系统索引的高效机制,避免了为每个文件单独发起系统调用的巨大开销。文章不仅给出了具体命令(`rsync -a --delete empty/ target/`),还指出该方法的灵活性——配合`--exclude`参数可以实现选择性删除,并且在删除后保留了原目录结构,方便复用。 对于运维人员或需要处理临时文件、缓存文件的开发者来说,这是一个非常实用的技巧,能显著节省处理时间。

本机暂存
IT 2013-06-08 23:38:39 / 累计浏览 11,615

Linux命令行里的“瑞士军刀”

这篇讲的是那些能用一行命令完成复杂任务的Linux“瑞士军刀”级技巧。作者分享了一组来自Quora的高效单行脚本,它们能用极简的语法替代大段的代码,威力惊人。 比如,要计算两个文本文件的交集、并集和差集,只需`cat a b | sort | uniq`的几种变体即可轻松搞定,无论文件多大。汇总一列数字的和,一条`awk`命令就能完成,比用Python写循环快3倍且代码量更少。想要快速查看目录下所有文件的大小和修改时间?`find . -type f -ls`比递归的`ls -lR`输出更清晰。 文章还展示了`xargs`的惊人力量——它能将标准输入转化为命令参数,用于批量处理,比如从文件读取主机名列表并并行执行SSH命令。另一个实用场景是分析Web日志:一行命令就能统计日志中特定参数(如`acct_id`)的请求次数,并按频率排序。 这些技巧的共同点是极致的效率与简洁,充分体现了Unix哲学中组合小工具完成大任务的思想。对于系统管理员或后端开发者来说,掌握这些单行命令,能让你在文本处理、系统运维等任务上如虎添翼。

本机暂存
IT 2013-06-03 22:57:37 / 累计浏览 3,461

RPM包的管理

这篇讲的是Linux世界里RPM包管理的那些事儿。文章从RPM(Red Hat Package Manager)这个Red Hat系发行版里的“老大哥”说起,它把软件预编译打包成标准格式,装起来是省心,但也被批评为不够灵活——你的系统环境得和打包时完全一致才行。 为了补上这块短板,SRPM(Source RPM)就登场了。它不光带源码,还贴心附上了依赖说明,安装时能自己检查缺啥。不过对于大多数用户,更常用的其实是YUM这个在线升级神器。它背后连着个服务器仓库,把所有软件和它们“谁依赖谁”的关系图都理得清清楚楚,一键安装就能自动摆平依赖链,和Debian系的apt-get解决的是同一类痛点。 文章后半段还聊了聊怎么自己动手打包RPM。核心工作是写好spec这个“配方文件”,软件叫啥、版本多少、安装时该跑什么命令都得写明白。至于找spec模板,优先级也说得很明白:先翻源码包,不行就找社区现成的改改,实在没有才自己从头写起。整个过程把RPM生态里打包分发的逻辑串了个七七八八。

本机暂存
IT 2013-05-29 22:37:00 / 累计浏览 4,565

如何诊断CDN故障

这篇讲的是当使用第三方CDN出现文件下载报错时,如何一步步锁定问题节点并诊断根源。作者从实际项目遇到的、节点众多导致排查困难这一痛点出发,分享了一套可操作的方法论。 核心步骤很清晰:先借助阿里测或Just-Ping等服务获取CDN的节点IP列表,然后利用一条结合xargs的shell命令并发测试所有节点的下载情况,通过对比下载文件的MD5值来精准定位异常节点。最后,再用淘宝IP库反查问题节点的地理位置,与用户反馈对照,就能确诊是哪个区域的网络或服务出了问题。 文中不仅给出了具体的命令示例,还贴心地列举了国内外常用的Javascript CDN地址作为参考。整篇文章从工具准备到执行验证,逻辑链条完整,对于运维和后端开发人员来说,是一份在CDN排障时能直接上手的实用指南。

本机暂存