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

系统运维

共 606 篇文章

IT 2013-06-03 22:57:37 / 累计浏览 3,376

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:20:56 / 累计浏览 7,677

腾讯分析系统架构解析

这篇讲的是腾讯分析(TA)系统如何应对日均处理上TB级数据、实现秒级更新的架构挑战。作者从数据采集到实时计算、存储的全链路出发,揭示了TA“数据全二进制化、计算全内存化、存储NoSQL化”的核心设计思路。 文章的重点在于其实时解决方案。在计算层面,系统借鉴了流式计算框架,采用增量计算模型,通过将所有数据类型转化为整型来大幅提升内存与计算效率。在存储层面,系统则巧妙地针对不同数据特性,组合使用Redis(高频更新的统计数据)和LevelDB(固定不变数据),并深度扩展Redis命令(如支持四则运算和批量字段更新)来优化查询与写入性能,显著降低了延迟与资源消耗。 此外,文中还详细阐述了其分片策略与双写复制等高可用设计。整个架构解析为构建高吞吐、低延迟的实时数据处理系统提供了清晰且可落地的思路,尤其对类似流式计算与海量数据应用场景具有参考价值。

IT 2013-05-20 23:24:24 / 累计浏览 4,149

Tomcat内存溢出的原因

生产环境中Tomcat内存设置不当容易引发各类溢出错误,这篇文章就系统总结了三种常见情况及其解决思路。 最典型的是Java heap space堆溢出,通常发生在98%时间用于GC且可用堆不足2%时。在无内存泄露的前提下,通过调整-Xms和-Xmx参数(建议设为相同值,如1024m)可解决,但需注意其上限受操作系统数据模型、虚拟内存及物理内存限制。 其次是PermGen space永久保存区域溢出,多因加载过多Class信息(如Hibernate、Spring框架动态生成类)导致。解决办法是加大-XX:PermSize与-XX:MaxPermSize参数,并需注意它们与-Xmx的总和不能超过系统最大JVM堆支持(如1.5G)。 第三种较为特殊,是unable to create new native thread无法创建新线程,这与JVM和系统内存分配比例有关。文章深入分析了JVM占用内存过多时,操作系统可用内存不足以创建更多物理线程的原理,并给出了线程数估算公式。此类问题需要同时调整操作系统与JVM参数。 作者从实际遇到的问题出发,不仅列出参数调整方案,还通过测试数据(如32位系统下堆大小限制)和原理分析(如线程创建机制)来支撑结论,强调需要根据不同溢出类型进行针对性诊断才能治本。

IT 2013-05-20 23:23:31 / 累计浏览 3,367

引导扇区实现

这篇讲的是如何从最底层实现一个操作系统启动的第一步:引导扇区。作者从BIOS加电自检后如何找到并执行启动代码讲起,解释了CPU进入实模式后的内存寻址机制,以及BIOS如何通过识别磁盘第一个扇区末尾的特定标志`0xaa55`来加载引导程序。 核心实现思路清晰:引导程序被加载到内存地址`0x7c00`处执行。文中给出了一段精简的汇编代码示例,演示了如何利用BIOS的`int 10h`中断,在屏幕上打印出“Hello,CB_OS!”字符串。这部分不仅展示了代码,还详细拆解了中断调用所需的参数设置,比如显示模式、字符长度和颜色属性。 巧妙之处在于,作者完整走通了从编写源码(`boot.asm`)、用`nasm`编译成二进制文件、再到通过`dd`命令写入磁盘镜像并使用bochs模拟器运行的整个流程。最终,在模拟器中成功看到输出,直观验证了引导扇区工作正常。文章从底层原理到可运行代码的完整路径,让操作系统启动这一抽象过程变得具体可感。

IT 2013-05-19 23:35:21 / 累计浏览 4,672

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

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

IT 2013-05-19 23:27:36 / 累计浏览 11,000

使用python/casperjs编写终极爬虫-客户端App的抓取

这篇讲的是在JavaScript动态渲染盛行的今天,如何有效抓取那些传统爬虫无能为力的“客户端App”型网页。作者以自动化获取Google Adwords关键词搜索量为实际案例,详细对比了两种实现路径。 文章首先回顾了经典的Selenium WebDriver方案。它像一位稳重的老兵,功能全面,能操控真实浏览器。作者分享了在无图形界面的服务器上配置它的技巧,并演示了如何通过分析页面结构、模拟登录、处理动态等待(如`implicitly_wait`)来一步步完成任务,最后用XPath提取出结果。方案虽可靠,但步骤相对繁琐。 随后,作者转向更现代的JavaScript Headless方案,重点介绍了CasperJS(基于PhantomJS)。这条路子轻快灵活,执行速度可达Selenium的三倍,代码也更直观——可以直接在浏览器控制台逻辑下编写。作者用它演示了几乎相同的功能,但指出CasperJS在进程间通信(IPC)方面存在局限。 最终,文章提供了一个完整的CasperJS爬虫脚本示例,读者替换账号即可运行。对于需要应对复杂JavaScript渲染的爬虫场景,这篇文章提供了从传统到现代的清晰路线图和实用代码。

IT 2013-05-19 23:25:34 / 累计浏览 3,131

服务器间同步/镜像/备份配置备忘录

这篇文章讲的是作者在从VPS迁移到独立服务器后,面对没有现成备份的困境,如何一步步摸索并比较各种文件同步方案,以实现可靠、实时备份的实战经历。 作者首先解决备份服务器的选型,找到了高性价比的大容量VPS。核心的挑战在于文件同步:基础的rsync配合cron定时任务虽然方便,但面对海量小文件和对“实时性”的追求,显得力不从心。于是,作者依次尝试了基于inotify机制的inotify-tools和sersync。文章详细记录了每一步的配置和遇到的真实问题:inotify-tools的过滤规则在实践中不顺手,日志混乱;而国产的sersync虽然整合了failover机制,看似更顺手,却暴露了多线程下大文件同步不完整、资源占用高等新问题,且文档和日志功能缺失。 最终,作者回归到inotify-tools,通过编写自定义脚本来解决文件过滤问题,找到了更可控的解决方案。整篇文章像一份技术人的踩坑笔记,清晰地对比了rsync、inotify-tools、sersync在功能、易用性、稳定性和资源消耗方面的差异,其价值不在于给出一个标准答案,而是为读者提供了在选择实时同步方案时,需要考量哪些实际维度——是稳定性、资源效率,还是配置的简洁性。

IT 2013-05-19 23:24:24 / 累计浏览 2,289

Erlang集群全联通问题及解决方案

这篇讲的是Erlang集群一个看似“贴心”但可能致命的设计:默认全联通。 作者从Erlang集群节点加入时的“引荐”机制讲起,新节点会被介绍给所有现有节点,从而建立一个完全连接的网状拓扑。问题在于,这种全联通连接数(N*(N-1)/2)会随节点数增加而爆炸式增长,不仅消耗大量系统资源,更因定期的心跳检测引发网络风暴,严重制约集群规模。 解决这个问题的方案出人意料地简单:在节点启动参数中加入“-hidden”标志,使其成为“隐藏节点”。如此一来,节点间的连接不会被主动发布,从而有效避免了不必要的全联通。 不过,作者特别提醒了一个关键细节:隐藏节点的行为是“或”逻辑——只要通信双方中有一方是隐藏节点,global模块就不会进行自动引荐。这个特性在实际部署和故障排查时必须留意。文章最后指出,社区已开始正视并规避这一设计带来的问题,对从事大规模分布式Erlang开发的工程师来说,这个经验颇具价值。

IT 2013-05-19 23:22:37 / 累计浏览 2,816

Erlang集群RPC通道拥塞问题及解决方案

当Erlang集群采用默认的全联通架构时,节点间通过RPC通道的密集调用可能引发严重的通道拥塞。文章从社区主流的分层服务架构出发,指出大量节点间消息流易导致dist端口忙,进而阻塞发送进程——由于RPC模块基于单进程gen_server,这种阻塞会直接拖累系统响应时间。 作者指出,这类问题可通过`erlang:system_monitor`的`busy_dist_port`事件及时感知,例如Riak系统便利用此机制告警。解决关键在于调整`dist_buf_busy_limit`参数:默认1MB的分布缓冲区上限可能不足,通过启动参数`+zdbbl`将其调大(如Riak案例中增至8MB),即可显著缓解阻塞、提升吞吐。文章结合监控实践与参数调优案例,提供了从问题定位到彻底解决的完整路径。

IT 2013-05-16 23:26:37 / 累计浏览 3,808

快速查看服务器硬件配置信息

这个脚本的目标很明确:为运维和开发人员提供一个一键式工具,快速获取Linux服务器的硬件与系统概况。它从几个关键维度着手,条理清晰。 首先,它智能识别操作系统发行版,无论是通过`lsb_release`还是直接读取`/etc/issue`,确保兼容性。接着,脚本深入`/proc/cpuinfo`和`/proc/meminfo`,提取CPU型号、物理颗数、核心数、逻辑处理器数,以及内存总量、交换空间、缓存等详细数据。对于磁盘信息,它整合了`fdisk`和`df`命令的结果,给出物理磁盘概况与各分区使用情况。 脚本的一个巧妙之处在于对64位系统的判断逻辑——通过检查CPU是否支持`lm`(长模式)标志,而非直接依赖系统位数。整个实现大量运用了管道和`awk`/`sed`进行文本处理,逻辑连贯,输出格式用等号线分隔,清晰易读。 对于需要快速摸底新服务器配置,或进行批量巡检的团队来说,这个脚本提供了一个非常直接、可立即落地的方案。它省去了手动拼接多个命令的麻烦,将分散的信息点整合成一份完整的“体检报告”。

IT 2013-05-15 23:00:23 / 累计浏览 10,795

推荐一些socket工具,TCP、UDP调试、抓包工具

作者从Fiddler和Charles这些HTTP调试神器聊起,引出了对socket及TCP/UDP调试工具的需求。文章没有停留在理论,而是直接推荐了几款作者亲测的实战工具,并点明了它们各自的长处。 Wireshark依然是底层抓包分析的王者,但文章特意提醒了它可能按端口号自动解码协议带来的小烦恼。而国产工具sokit则更像一把“瑞士军刀”,作者重点介绍了它基于QT的跨平台特性、方便的二进制包组装能力,以及模拟分包/粘包和轻量级抓包的实用功能,甚至分享了自己曾因一个空格导致发送数据异常的真实小故事,这恰恰凸显了详细日志的重要性。 除此之外,文章还对比了体积小巧的TCP/IP Builder,以及能直观监控系统所有连接、帮助排查异常进程的Windows工具TCPView。整体来看,这篇推荐就像一份从实战出发的工具清单,帮助开发者根据具体场景——是深度抓包分析、快速调试协议,还是监控连接状态——选择最顺手的兵器。

IT 2013-05-14 22:28:48 / 累计浏览 2,370

Ruby的多线程应用服务器介绍

这篇讲的是随着Rails 4.0默认开启多线程模式,Ruby Web开发迎来了多线程服务器选型的新阶段。作者对三款主流选择进行了对比分析。 Rainbows和Puma都支持master-worker集群模式,能充分利用多核服务器。Rainbows脱胎于稳定的unicorn,提供了丰富的进程控制信号,适合对稳定性和运维控制要求高的大型应用。Puma的特色在于线程数可根据请求量在设定范围内自动伸缩,且单进程模式更节省内存,对中小型应用更友好。而Zbatery是极简的单进程多线程版本,是三者中最省内存的,适合在VPS上托管多个低流量应用。 作者的性能测试显示两者差异不大,选择更多取决于场景:追求稳定与可管理性选Rainbows,希望节省资源与灵活伸缩则Puma更佳。

IT 2013-05-01 22:38:40 / 累计浏览 8,741

推荐一些socket工具,TCP、UDP调试、抓包工具

这篇讲的是作者从自己推荐HTTP调试工具的过往经验出发,引出了对Socket、TCP/UDP调试及抓包工具的系统推荐。作者作为一名“工具控”,不仅介绍了像Wireshark这样公认的网络抓包神器——它功能强大但偶尔会“自作聪明”地按端口号解码协议,也重点安利了一款国人开发的跨平台工具sokit,它能方便地模拟分包粘包,支持客户端、服务器、代理三种模式,不过作者也分享了一个在发送二进制数据包时因空格导致发送异常的小坑。 文章还列举了TCP/IP Builder、TCPView等其他几款各有侧重的工具。其中,TCPView尤其适合用于监控系统当前的TCP/UDP连接状态,甚至能帮助排查一些异常连接。作者最后也坦言,对于简单的调试需求,自己动手写脚本同样便捷。 这些工具基本覆盖了从数据包捕获、协议分析到连接状态监控的常见场景,适合在不同环节辅助开发者进行Socket通信的调试与排查。

IT 2013-05-01 18:40:03 / 累计浏览 3,629

被遗忘的Logrotate

作者在运维工作中观察到一个有趣的现象:许多服务器上运行着自定义的 CRON 脚本(如每天切分 Nginx 日志),却遗忘了系统自带的 Logrotate 工具。这篇文章正是从这一现象出发,重新介绍了 Logrotate 的实用价值。 文章首先解析了 Logrotate 基于 CRON 的运行流程与核心配置文件,随后以按天轮转并压缩 Nginx 日志为例,展示了其简洁的配置方法。作者特别解答了几个常见疑问:`sharedscripts` 指令如何在多个日志文件轮转后统一执行脚本、`rotate` 与 `maxage` 在控制保留份数上的区别,以及如何通过 `postrotate` 发送信号或使用 `copytruncate` 指令来通知应用程序重新打开日志。 相比于手写轮子,Logrotate 提供了更稳定、功能更完整的现成方案,支持压缩、灵活的保留策略以及与各类应用的交互脚本,能有效避免重复造轮子。文章还提到了 cronolog、savelog 等相关工具作为补充参考。

IT 2013-05-01 18:07:24 / 累计浏览 2,873

Perl 实现 Flash 的 Socket Policy 服务器

这篇讲的是作者从一个误解出发,折腾出一个轻量解决方案的实践经历。起初,为了支持Flash P2P功能的测试,作者需要提供Socket策略文件。他最初错误地以为只需用HTTP服务器响应,直到被合作方提醒,才明白Flash Player的机制:在建立Socket连接前,它会主动向服务器的843端口发送一个 `` 字符串以请求策略文件。 理解了这个机制后,作者利用Perl的AnyEvent框架,仅用几分钟就实现了一个TCP服务器来响应这个请求。核心代码展示了AnyEvent::Handle的强大:它让服务器可以简洁地监听连接,并依据自定义规则(此处是收到特定字符串)进行读写。收到请求后,服务器直接返回预设的 `crossdomain.xml` 内容并主动断开连接,完美符合协议要求。作者也借此引出了AnyEvent在快速构建高性能TCP服务上的便利性。 文章最后,作者提到自己后来发现GitHub上已有类似实现,相当于“重复造了个轮子”。但整个过程清晰地记录了问题排查、机制理解和代码实现的完整链条,对需要处理类似Flash Socket安全策略的开发者,是一个直接而有用的参考。

IT 2013-05-01 17:36:13 / 累计浏览 3,087

使用 AnyEvent 来实现同一个端口跑二种服务

这篇讲的是一个非常实际的网络访问问题:当 Linode 的 SSH 端口(22)被 GFW 过滤后,如何利用仍然开放的 80 端口,让同一台服务器同时提供 HTTP 和 SSH 两种服务。作者从这个痛点出发,实现了一个基于 Perl AnyEvent 库的协议识别与转发代理。 核心方案在于对连接建立时发送的初始数据包进行嗅探。对于 HTTP 请求,开头通常包含“GET”、“POST”等关键字;而对于 SSH 连接,像 SecureCRT 或 Bitvise 这样的客户端会主动发送包含“SSH”字样的协议头。程序根据这个特征,将连接动态转发到本地对应的 80 或 22 端口后端服务。作者基于国外一个 Perl 实现进行了重写和封装,利用 AnyEvent 的事件循环特性来构建高性能的异步代理。 最终效果就是,作者现在浏览的网页和远程管理都是通过这同一个 80 端口完成的。这个方案虽然牺牲了使用 CDN 的可能性,但在特定网络环境下,提供了一种巧妙且有效的端口复用思路。

IT 2013-04-07 13:04:38 / 累计浏览 3,329

使用tcpdump搞定一个替换问题

这篇讲的是如何在不直接修改数据库的情况下,动态替换服务器渲染输出中的链接。作者面临的背景问题是代码混乱,无法快速定位哪些接口需要修改,暴力查找效率低下。 他找到了一个巧妙的解法:使用 `tcpdump` 抓取服务器的出口流量,并过滤包含问题链接的响应。为了进一步定位具体是哪个请求路径,文章给出了两个实用技巧:在PHP中利用 `auto_prepend_file` 或在Nginx中利用 `add_header`,为每个响应统一注入一个 `X-Request-URI` 头部。这样,在过滤出的内容中就能直观看到对应的地址,让替换工作变得精准。 虽然Nginx有专门的Substitution模块可以完成替换,但作者认为在本例中这种方案显得过重。最终,这个案例展示了一个道理:即便是简单的替换问题,选择合适的方法能极大影响效率,值得我们多思考一步。

IT 2013-04-06 23:17:19 / 累计浏览 6,250

移动互联网创业公司的服务器选择

这篇讲的是早期移动互联网团队,在预算和人力有限的情况下,如何务实选择服务器。作者从网络、硬件到软件,结合自己踩过的坑,给出了具体建议。 网络方面,他指出国内网络成本高,要先分析用户地域集中度来省钱,并强调机房在搜索引擎的“能见度”至关重要,否则用户手机根本访问不了。前期租用双线机房是更经济的选择。 硬件部分,他点明了几个容易被忽略但关键的细节:配内存条要匹配主板通道(比如三通道主板用三条相同内存)、务必检查RAID卡电池并开启缓存(对MySQL性能提升明显)、以及SSD应优先给数据库服务器使用,应用服务器则不需要。 软件选型上,他根据社区调查推荐CentOS,并特别提到移动互联网的协议选择。由于手机网络环境复杂,建议用HTTP协议并设置特定Header(如声明为JSON),来防止运营商劫持注入广告。 总的来说,这篇文章像一份为初创团队准备的、从基础设施到代码层面的实战避坑指南,每一条建议都直指小团队资源有限的痛点。

IT 2013-03-05 13:28:38 / 累计浏览 9,260

Linux常用性能调优工具索引

这篇盘点了Linux性能调优的“武器库”,源自Brendan Gregg经典的性能分析图谱。作者并未止步于理论图表,而是结合自身多年的运维与优化实践,将图中提到的数十款核心工具与自己的实战笔记一一关联。 从监控网络流量的nicstat,到剖析内核函数的perf与systemtap,再到排查I/O瓶颈的iotop和blktrace,文章为每一个工具都提供了可直达的深度解读链接。它更像一个精心整理的工具箱导览,涵盖了从宏观系统监控(如top、vmstat、dstat)到微观进程追踪(如strace、pidstat)的完整工具链。 对于系统工程师和开发者而言,这份索引省去了逐一搜寻的功夫,提供了按需取用的便利入口。当你在面对CPU、内存、磁盘或网络的性能谜题时,可以从这里快速找到那个最称手的工具。

IT 2013-03-04 14:33:23 / 累计浏览 4,534

Iowait的成因、对系统影响及对策

这篇技术文章深入剖析了Linux系统中iowait的产生机制,从现象追踪到内核源码,揭示了这一指标背后的完整逻辑。 文章首先厘清概念,指出iowait的产生需要同时满足两个条件:有进程因I/O阻塞,且当前CPU上没有其他可运行的进程,导致CPU只能执行空闲任务。随后,作者引导读者从`vmstat`命令看到的表象,深入到`/proc/stat`文件的数据来源,并一路追到内核代码。 核心亮点在于对内核函数`account_system_time`的分析。文章通过代码指出,只有当`rq->nr_iowait > 0`(有进程等待I/O)且`p == rq->idle`(当前CPU在空闲)时,这段CPU时间才会被计入iowait。而引发这一切的源头,则是`io_schedule`和`io_schedule_timeout`这两个函数。文章进一步使用SystemTap编写脚本进行实际验证,通过在高负载引擎服务上追踪这些函数的调用栈,清晰展示了I/O等待的具体发生场景。 作者通过理论分析与实战验证相结合的方式,完整展现了iowait从现象到根源的追踪过程,让抽象的概念变得具体可感。