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

DevOps

共 867 篇文章

IT 2013-08-14 13:36:29 / 累计浏览 1,401

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

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

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

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,483

找回linux丢失的磁盘空间

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

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

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 / 累计浏览 1,981

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

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

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

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

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

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

服务器监控软件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,546

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,741

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

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

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

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

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

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

正确用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,162

各就各位,各司其职

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

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

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,525

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,380

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,500

如何诊断CDN故障

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

本机暂存
IT 2013-05-29 22:36:11 / 累计浏览 4,480

Shell的那些事儿

这篇讲的是 Shell 语言如何从大学里一个简单的工具,成长为作者工作中不可或缺的效率利器。作者从学生时代用 Shell 命令裁减文件系统、处理 BAT 脚本讲起,到工作后利用 `grep -Irl` 快速查找文本文件,或用 `find |xargs wc -l` 统计代码行数,生动展现了 Shell 在解决实际问题时“组合命令”的核心魅力。 文章并未停留在基础用法,而是深入探讨了 Shell 的“工程化”一面。作者分享了在性能团队学到的实用技巧,比如用 `-x` 选项调试脚本执行过程、设置参数默认值以及实现进程并发控制。同时,也坦诚讨论了 Shell 语法的灵活性甚至“不严谨”之处,比如 `if` 语句的多种写法和对换行符的敏感,并澄清了如何正确处理分号与命令返回值 `$?` 的使用。 作者的最终观点很明确:相对于 C/C++/Java 等编译型语言,Shell 作为一种“工具性语言”,以其无需编译、即写即测的特性,提供了无与伦比的开发效率。无论是压力测试还是复杂逻辑控制,它都是快速将想法落地的首选。文末那句“不熟悉 Shell 都不好意思说会性能调优”,既是对 Shell 地位的肯定,也点明了在追求效率的现代开发中,掌握这门语言的重要性。

本机暂存
IT 2013-05-20 23:18:48 / 累计浏览 15,881

如何成为OpenStack工程师

这是一篇为想成为OpenStack工程师的人绘制的成长地图。作者从“0级”的基础技能储备讲起,强调了Python、Linux、Git等工具的重要性,并给出了从入门到进阶的具体学习资源,比如《Python参考手册》、《鸟哥的Linux私房菜》以及Pro Git在线书。 接着,文章将视角转向“1级”的OpenStack专项学习。这部分详细拆解了从理解核心概念(Compute、Network、Object Storage)、动手使用平台(通过界面或命令行),到搭建开发环境(使用devstack、deb包或源码安装)的完整路径。它不仅仅是罗列资源,更像一个教练,指导读者如何通过stacklab.org实践、阅读管理员手册来逐步深入。 文章开篇点明的“态度开放、主动沟通”以及“自动化、流程化、文档化”的思维,也为整个技术学习之旅定下了基调。对于新手而言,这份清单清晰地指明了先打牢基础、再逐步攻破专业模块的可行路径,为后续的源码分析和实战打下了扎实的基础。

本机暂存
IT 2013-05-19 23:35:21 / 累计浏览 4,661

自动化运维之企业实际案例分析

这是一篇方案/架构类的实战分享,讲的是如何利用Puppet应对大规模服务器批量管理的挑战。 作者从一个具体场景出发:某公司新到500台服务器,后续需要批量修改100台机器的NTP时间同步配置。如果依赖手动登录或编写脚本逐一执行,效率极低且容易出错。文章核心展示了如何利用Puppet的`exec`资源,通过一行`sed`命令在几分钟内完成所有配置变更,直观体现了自动化运维的效率优势。 另一个案例则更为完整,涉及使用Puppet的`file`资源统一推送rsync脚本和密钥文件到客户端,并配合`exec`资源在文件变化时自动触发数据备份与同步。这完整演示了从配置分发到状态触发执行的Puppet工作流。 文章在结尾总结时并未停留在代码层面,而是抛出了几个值得深思的实际问题:如何对Puppet客户端进行高效分组、Master服务器性能如何横向扩展、以及如何与SVN等工具链集成。这些思考点明了从“会用”到“用好”自动化运维工具的关键进阶方向。

本机暂存
IT 2013-05-19 23:28:29 / 累计浏览 2,262

如何通过修改注册表来添加删除Windows的系统服务

这篇讲的是如何通过修改注册表来管理Windows系统服务,特别是在默认工具不灵活时提供更底层的控制方法。在系统维护中,清理无用服务或添加自定义服务是常见需求,但直接操作注册表需要谨慎,文章详细拆解了关键步骤。 删除服务部分介绍了三种实用方法:使用sc命令行工具(如“sc delete KSD2Service”),直接编辑注册表删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下的键值,以及处理特殊情况——例如服务由系统进程保护时,需先结束进程或进入安全模式再操作。这些方法覆盖了从简单命令到深度清理的不同场景。 添加服务部分则深入讲解如何通过注册表创建新服务项,并设置必要的键值:DisplayName(服务名称)、ImagePath(程序路径)、Start(启动类型,值2为自动,3为手动,4为禁止)等。文章以添加QQ程序为服务为例,展示了如何逐步配置并验证效果。 通过这些方法,用户可以灵活地控制服务启动状态和系统资源,解决服务冲突或优化性能。文章提供了具体技术细节和注意事项,避免常见误操作,适合需要精细管理Windows环境的系统管理员参考。

本机暂存