IT技术博客大学习 共学习 共进步

系统运维

共 606 篇文章

IT 2013-08-02 13:23:40 / 累计浏览 3,195

RAID卡MTRR的RAID模式write-combining

这篇讲的是CPU中一个常被忽略的硬件优化机制——合并写(write-combining)缓冲区,以及如何通过代码设计来利用它提升性能。 现代CPU为了弥合与主存的速度鸿沟,不仅依赖多级缓存,还内置了数量有限的、大小与缓存行相同的写缓冲区。当写入操作未命中缓存时,数据会暂存于此。如果后续有针对同一缓存行的写入,硬件能将这些数据在缓冲区中合并,等凑够有效数据后再一次性传输到下级缓存,从而极大提升总线效率。 文章通过一段Java代码做了生动对比:一种写法是在单个循环中连续写入6个不同数组的相同内存位置;另一种则是将任务拆分,先用一个循环写入前3个数组,再用另一个循环写入后3个数组。测试结果显示,拆分循环的方式耗时几乎减少了一半(例如从约14秒降至约8秒)。这个反直觉的结果,正是因为它更好地匹配了CPU有限的写缓冲区(例如Intel CPU通常只有4个),确保每次循环写入都在缓冲区容量内,从而有效触发了合并写机制,避免了缓冲区被过早填满而带来的性能惩罚。 文章通过这个具体例子揭示,理解CPU微架构的底层细节,有时能写出表面冗余但实际运行更快的代码。即使做了更多循环迭代,但优化的内存访问模式带来了实实在在的性能收益。

IT 2013-07-31 13:32:23 / 累计浏览 3,692

进程管理器supervisor的使用(django实例)

这篇讲的是用Supervisor管理多个Django进程的具体实践。作者从Python生产环境中常见的进程管理需求出发,介绍了Supervisor这个由Python实现的工具。 在典型的部署场景里,通常需要用Supervisor同时启动多个Django或Tornado应用,让它们监听不同端口,再由前端的Nginx进行反向代理。文章以Ubuntu环境为例,详细演示了从创建Python虚拟环境、安装Supervisor,到编写配置文件的完整过程。 配置是关键,作者分享了几个核心点:通过`numprocs`参数指定启动的进程数,结合`process_num`变量动态分配不同端口;特别提到了配置Unix socket文件时,权限设置需使用`sockchown`而非`chown`的坑。最终的目标是让一个名为“sayhello”的Django项目成功运行在8000和8001两个端口上。 文章也坦诚地提到,对于这种架构是否算负载均衡,作者尚未深入研究,展现了实践中边做边学的真实状态。整体而言,这是一篇聚焦于具体配置和常见陷阱的实用向导。

IT 2013-07-31 13:12:54 / 累计浏览 2,836

HBase解决Region Server Compact过程占用大量网络出口带宽的问题

这篇讲的是作者在维护一个HBase 0.94.0集群时遇到的实际问题。他们发现多台Region Server的网络出口带宽经常跑满千兆网卡极限(接近100MB/s),机器负载也异常高。在排查中,一个关键疑点是:根据查询量估算,出口带宽本应只需约60MB/s,但实际观测值却多出了约40MB/s。 经过对源码(CompactSplitThread.java)的分析,根因被定位为集群在高写入压力下频繁触发了Compaction。由于Compaction过程本身需要读取大量数据,从而“偷走”了这部分额外的网络带宽。这是一个在0.92版本后,因引入small/large Compaction线程而可能出现的典型性能问题。 为此,作者提出了两个具体的配置调整方案。核心思路都是减少Compaction的并发度或触发频率:一是通过调大throttle值强制所有Compaction变为small类型,并保持线程数为1;二是直接将small Compaction线程数设为0以关闭它。应用配置后,Region Server的网络利用率显著下降至70MB/s以下,问题得到有效解决。

IT 2013-07-30 13:50:50 / 累计浏览 8,489

找回linux丢失的磁盘空间

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

IT 2013-07-30 13:50:15 / 累计浏览 2,613

ext4+delalloc造成单次写延迟增加的分析

这篇讲的是淘宝内核组在将线上系统升级到Ext4文件系统后,发现应用写操作延迟异常增大的故障。根源在于Ext4的新特性“延迟分配”(delalloc)。 简单来说,delalloc为了优化后续的顺序访问性能,将原本每次写操作都会进行的磁盘块分配过程,推迟到了系统批量回写数据时才进行。这导致了一个关键的锁竞争问题:回写进程在批量分配磁盘块时需要持有排他写锁(i_data_sem),这个过程可能耗时较长(例如约30秒一次)。如果此时有应用程序发起新的写操作,它就必须等待这把锁释放,从而导致单次写操作的延迟被显著拉高。 作者通过fio工具进行了量化测试:开启delalloc后,虽然写操作的平均延迟更低(5.86微秒 vs 7.00微秒),但最大延迟却飙升到了193毫秒,是关闭时(16毫秒)的10倍以上。这清晰地说明了delalloc“集中处理”带来的长尾延迟问题。 对于使用Buffer IO进行追加写、不主动刷新数据且对延迟敏感的应用,这个问题会尤为突出。文章给出的解决方法是在挂载时加上`nodelloc`参数来关闭此特性。

IT 2013-07-30 13:41:13 / 累计浏览 3,828

开源PHP监控扩展:witness简介

这篇讲的是一个专为PHP环境设计的开源监控扩展——witness。它瞄准的是PHP多进程、多机器部署架构下,难以追踪和排查特定用户请求问题的痛点。当线上出现只影响个别用户的故障时,传统加日志的方式往往效率低下且可能引入新问题。 witness的解决方案巧妙而直接:它作为一个底层扩展嵌入PHP引擎,无需修改业务代码。核心能力在于可以通过设置特定的cookie,对来自目标用户的请求进行精准监控。它提供了两种核心模式:trace模式记录完整的函数调用流,像“拍视频”一样还原过程;dump模式则抓取当前调用栈的详细状态,如同“拍照片”保留瞬间细节。 文章详细介绍了系统的三层架构(扩展、数据传输、数据展示),以及具体的安装、配置步骤。扩展以配置项控制行为,如监控深度、是否记录内置函数等,灵活度很高。数据最终会汇总,便于后续可视化分析。 总的来说,witness提供了一套轻量且高性能的非侵入式方案,让PHP开发者能在复杂分布式环境中,更精准、高效地定位那些“幽灵般”的个别用户问题。项目已在GitHub开源。

IT 2013-07-29 22:54:55 / 累计浏览 1,989

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

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

IT 2013-07-28 15:30:20 / 累计浏览 3,930

关于进程监控及自动启动

作者从自己将uWSGI更换为Gunicorn的实际经验出发,系统梳理了三种服务器进程监控与自动重启的方法。文章并非纸上谈兵,而是结合了腾讯内部实践与个人小团队部署的考量。 第一种方法是按进程名监控,实现简单直接。作者用Python脚本示例了如何通过`ps`和`grep`检测进程是否存在,并指出了其弊端:比如Gunicorn启动后进程名可能变为`master: [wsgi:app]`,其中的方括号需要转义,实际操作并不舒服。 第二种是按端口监控,作者认为这反而更为靠谱。同样附上了Python代码示例,通过尝试绑定目标端口来判断服务是否存活。作者也讨论了更深入的“黑盒”式连接监控(如模拟HTTP请求),但认为这更偏向监控宝一类的外部服务方案。 第三种方案则是借助Supervisor等外部管理工具。作者比较了Gunicorn文档中提及的Gaffer和更成熟的Supervisor,后者提供Web界面和用户验证,管理便捷。但代价是失去了直接使用`restart.sh`脚本的灵活性,需要适应其特定的命令。文章最终提供了一个Supervisor配置Gunicorn的示例配置片段,并开源了相关监控代码。整体上,作者为不同场景下的运维监控提供了具体可参考的实现对比。

IT 2013-07-26 13:25:46 / 累计浏览 4,265

服务器监控软件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-26 13:24:45 / 累计浏览 2,926

学习搭建Python2.7.5环境

作者从写PHP多年有些厌倦、想转学Python的角度出发,分享了在CentOS系统上从零搭建Python 2.7.5开发环境的全过程。文章并非枯燥的步骤罗列,而是带着个人学习动机,清晰地讲解了从下载源码、编译安装,到配置包管理工具和隔离环境的一套完整实践。 文中特别指出,原先流行的setuptools已被distribute取代,easy_install也被pip取代,并给出了具体的安装命令。核心环节是介绍virtualenv这个必备工具——它允许创建完全隔离的Python环境,避免不同项目间的依赖冲突。作者也演示了如何创建、激活和退出环境。 文章最后提醒,使用virtualenv管理多环境时,脚本里应使用`#!/usr/bin/env python`而非绝对路径以增强通用性,并推荐了pyenv等工具来管理不同Python版本。结尾以幽默的口吻表达了对“3P伟业”的憧憬,让技术分享多了几分生动。

IT 2013-07-15 13:23:33 / 累计浏览 2,233

CFS中的虚拟运行时间

这篇讲的是Linux内核CFS调度器中最核心也最容易让人困惑的一个概念:虚拟运行时间(vruntime)。作者从对vruntime的不理解出发,在研究cgroup的CPU子系统时,才真正理清了它的原理。 CFS追求的是理想中的“完全公平”,但现实中同一时刻一个CPU核心只能跑一个进程。因此,算法需要一种机制来惩罚当前占用CPU的进程,从而照顾那些等待的进程。这个机制,就是vruntime。简单说,vruntime越小的进程,越值得被调度。 它的精妙之处在于计算方式:vruntime并非进程实际运行的时间,而是结合了进程“权重”后的换算值。权重越大(对应用户态优先级nice值越低),进程实际运行一毫秒所产生的vruntime就越小,这样它在调度队列中的位置就越靠前(内核用一棵红黑树管理,vruntime小的在左端),从而获得更多的CPU时间。 文章还揭示了内核是如何将用户熟悉的nice值映射到内部权重的,那就是通过一个叫`prio_to_weight`的静态数组进行转换。这套机制将“优先级”这个概念,巧妙地转化为“需要运行的紧迫度”,从而在动态调度中实现了对不同重要性进程的公平分配。

IT 2013-07-15 13:16:40 / 累计浏览 6,596

大数据下的工行

这篇讲的是工行2013年那场著名的系统故障,作者从一条已消失的微博切入,还原了事件的全过程。故障发生在计划内数据库升级(DB2从V9升至V10)后的首个业务高峰,暴露出凌晨低负载测试无法完全模拟真实压力的问题。 文章的核心技术分析指出,问题可能源于IBM软件的内存清理缺陷,导致数据库主机CPU和内存迅速耗尽。作者站在DBA视角,还原了故障当时的决策困境:是冒险切换至未经充分验证的灾备中心(可能牺牲数据一致性),还是耗时更长但能保证数据完整地回退版本?理性选择了后者,这符合金融系统对CPA中一致性(C)的严格要求。 文中还穿插了作者亲历的2008年淘宝机房断电惊魂时刻,形成对比——成熟的容灾架构需通过定期实战演习来锻造,而非仅靠昂贵备库。最后,文章对工行将直接原因归咎于IBM软件缺陷的内部通报,留下了耐人寻味的评论。全文通过一个具体故障,探讨了大型系统运维中测试验证、灾备切换与故障复盘的真实逻辑。

IT 2013-07-10 13:47:02 / 累计浏览 3,713

数据的存储介质-磁盘的RAID

这篇讲的是如何通过RAID技术将多块磁盘组织起来,从而突破单盘性能与安全性的限制。作者从计算机存储的两个基本要素——通信管道与存储介质出发,引出RAID的核心思想:通过数据分区(Partition)提升吞吐量与IOPS,通过数据复制(Replication)保障安全。 文章清晰地对比了几种经典RAID模式。RAID0纯粹追求并行读写的速度,但毫无冗余;RAID1采用全盘镜像,安全但空间代价高昂。RAID5用XOR校验位巧妙地在安全与空间利用率间取得平衡。而现实中更常用的RAID10(1+0)与理论上更优的RAID01,文章通过图示和坏盘场景分析,点明了为何“先冗余后分区”的RAID10才是工程首选。 更深入一层,文章探讨了实现RAID的两种形态:依赖RAID卡、电池与SSD保障日志的单机方案,以及通过光纤通道、InfiniBand等协议连接的外部盘柜。最后,作者将视角延伸至分布式存储,指出HDFS、GFS等系统本质上借鉴了RAID10的思路,并点明了在上层已做复制切分时,底层再用传统RAID可能带来的冗余与性能损耗。

IT 2013-07-10 13:45:23 / 累计浏览 2,505

数据的存储介质-磁盘的硬件特性

这篇讲的是磁盘硬件的核心工作原理,作者从硬件决定软件性能的根本逻辑出发,带我们看懂这个既熟悉又陌生的“老古董”。他从磁盘的老祖宗——磁带机讲起,清晰解释了硬盘为实现“随机访问”而做出的关键设计:让磁介质盘片匀速旋转,由轻量化的磁头臂负责寻道移动,而不是反过来。 文章还深入了一个常被忽视但至关重要的细节:磁盘块的原子写入。它解释了磁盘如何保证在异常断电情况下数据不“写一半”,即通过开机时的检查与清理来维持逻辑一致性。这种“最大努力保证原子性”的思路,是理解单机存储一致性的基础。 对于容易混淆的IOPS(每秒读写操作数)和吞吐量(MB/秒),作者用“飞机运旅客”的生动比喻做了拆解。IOPS看重减少寻道和旋转延迟,适合数据库等小数据随机访问场景;吞吐量则擅长顺序大文件写入,比如视频存储。两者与延迟存在动态权衡关系。 整篇文章用通俗的语言和比喻,把磁盘的机械特性、数据组织方式以及性能指标的内在关联讲得明明白白。对于想优化存储性能或理解上层软件(如数据库、文件系统)行为的工程师来说,这是打下坚实基础的必要一课。

IT 2013-07-08 22:49:01 / 累计浏览 2,508

scribe的生产实践总结

作者结合两年生产实践,分享了对Facebook开源日志系统Scribe的应用总结。Scribe以精简稳定著称,作者团队在线上运行超过两年,未曾遭遇其自身进程崩溃。 文章核心聚焦于生产环境中Scribe的关键运维实践。针对Master节点宕机,标准配置是Primary接Secondary文件,故障时日志本地缓存,恢复后自动补发,并可通过一行脚本监控积压。为防止Scribe进程意外阻塞业务,建议采用异步线程写日志。而最棘手的情况是网络拥塞导致日志追送困难,作者提到一项压缩传输的改造尝试。文章最后将Scribe与LinkedIn开源的Kafka进行对比:Scribe如同“激流勇进”的冲锋舟,简单可靠;Kafka则似“航空母舰”,以集群和去中心化设计,对单点故障的容忍度更高。作者认为,对于中心化的日志收集场景,两者各有适用之处。

IT 2013-07-07 22:18:54 / 累计浏览 2,987

SSH简介

这篇讲解SSH基础知识的文章,从“什么是SSH”直接切入,梳理了这项安全协议从诞生到普及的简要历程,重点则落在了实际操作与安全原理上。 文章系统梳理了SSH的核心用法:从最基础的远程登录命令,到端口参数修改。它详细拆解了SSH保障安全的关键——公钥加密验证流程,并分别阐述了两种登录方式:“口令登录”与“公钥登录”。对于后者,文章不仅解释了免密原理,还一步步指导读者如何生成密钥对、使用`ssh-copy-id`上传公钥,以及如何排查服务端配置问题。 特别值得注意的是,文中对公钥指纹验证、`known_hosts`文件的作用,以及`authorized_keys`文件的具体操作都有细致说明。这些细节对于理解SSH建立信任链的过程至关重要,也为实际配置提供了清晰路线图。对于需要安全远程管理的开发者或运维人员,这是一篇扎实的入门指南。

IT 2013-07-07 22:05:39 / 累计浏览 7,497

用unix socket加速php-fpm、mysql、redis的连接

这篇文章探讨了在单机环境下,如何通过unix socket来优化php-fpm、mysql和redis的连接性能。作者从图虫服务器的单机运行现状出发,指出即使使用127.0.0.1本地IP,连接仍需经过TCP/IP层,引入不必要的开销;对于像图虫这样单机日处理2000万+动态请求的服务,切换到unix socket能直接绕过网络栈,实现更快的本地通信。 文章通过一个简单测试展示了立竿见影的效果:200次redis请求耗时从38ms降至27ms,这10毫秒的差距在高并发场景下足以驱动优化。配置方法也被详细列出——对于mysql(PDO),需在DS

IT 2013-06-19 22:29:42 / 累计浏览 5,010

正确用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-17 23:57:16 / 累计浏览 6,812

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-09 13:34:53 / 累计浏览 3,229

不同SSD盘组合搜索引擎单机性能测试[2013年版]

作者从搜索引擎单机性能优化的需求出发,在一台配置了24核Xeon E5 CPU、近50GB内存的Linux服务器上,对不同SSD盘组合策略下的HA3引擎性能进行了系统测试。测试数据规模可观,索引达59G,摘要73G。 文章详细对比了多种方案:从全内存基准、单盘SSD,到由两块或三块盘组成的RAID 0、RAID 1,以及不使用硬件RAID而采用软连接或数据分片的方式。测试严格控制了IO调度、预读、线程数等变量,并通过abench工具获取峰值QPS。 核心发现颇具实用价值:当索引量翻倍时,性能近似减半,表明IO是关键瓶颈。单纯增加RAID 0的磁盘数对搜索引擎引擎性能提升有限,瓶颈会转移至CPU锁开销。最引人注目的结论是,两块SSD盘不使用硬件RAID,而是通过软件将数据按term哈希键分片存储,能达到约18%的性能提升,优于RAID 0的12%提升,也远超传统的多段软连接方式。 文章最终给出了分层建议:在CPU性能制约时,应重点解决IO瓶颈(如采用多盘按term切分);当磁盘增多后,则需关注CPU锁优化。对于写入场景,也提出了普通盘与SSD搭配的实践方案。