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

系统运维

共 606 篇文章

IT 2013-01-08 13:03:03 / 累计浏览 2,609

Ubuntu Server清理无用内核

这篇文章解决的是Ubuntu Server在多次系统升级后,旧内核包(headers和image文件)累积占用磁盘空间的问题。作者直接给出了具体的清理步骤和命令。 方法首先通过 `dpkg --get-selections|grep linux` 命令列出所有与Linux内核相关的已安装软件包,让你清楚地看到哪些旧版本的内核headers和镜像文件仍然存在。接着,文章演示了如何使用 `sudo apt-get remove` 命令,针对每一个不再需要的旧内核版本(例如3.5.0-17和3.5.0-19),分别移除其对应的headers和image包。 在执行完清理命令后,文章再次运行查看命令进行验证。结果显示,之前状态为“install”的旧内核包已变为“deinstall”(卸载),而当前使用的内核版本(3.5.0-21)及其相关组件则保持“install”状态。整个过程清晰明了,从发现问题、执行操作到验证结果,形成了一个完整的操作闭环。 这篇文章的价值在于提供了明确的步骤和验证方法,对于需要手动管理内核、优化服务器存储的系统管理员来说,是一个非常实用的参考。

IT 2012-12-25 12:31:02 / 累计浏览 3,256

Node.js和testacular的安装与配置

这篇讲的是作者从尝试安装测试工具testacular开始,顺带入门Node.js的一次踩坑实录。文章的核心问题很常见:在公司内网环境下,通过npm安装testacular或express时总遇到超时,但浏览器却能正常访问npm仓库。作者通过排查,判断根因在于npm默认配置使用了https协议,而公司网络可能限制了这种连接。 解决过程很直接:通过命令行修改npm的配置,将registry地址从https切换为http,并设置与浏览器相同的代理地址。具体操作是运行`npm config set registry`和`npm config set proxy`命令,之后便成功完成了安装。作者还记录了初始化testacular时遇到的一个路径小问题,以及最终通过`testacular start`命令在本地启动测试的完整流程。 整个记录以步骤为线索,穿插了具体的命令、报错截图和配置细节,对于同样遇到npm网络问题的开发者,提供了一个清晰的排查思路和解决方案参考。

IT 2012-12-24 13:31:35 / 累计浏览 2,628

用msmtp代替系统自身的sendmail

系统自带的sendmail因为漏洞多、配置复杂,常被管理员禁用,但这会导致cron任务出错时无法及时知晓。作者为了解决这个问题,放弃了之前使用的但已停止维护的ssmtp,转而寻找并采用了msmtp作为轻量级替代方案。 文章详细分享了从安装、配置到与系统深度集成的完整步骤。关键不仅在于如何配置msmtp连接邮件服务器,更在于两个精妙的实践:一是修改`/etc/mail.rc`让系统`mail`命令默认使用msmtp;二是在crond配置中为`CRONDARGS`参数正确添加了`-t`选项。 作者特别指出,这个`-t`参数至关重要,它确保msmtp从标准输入读取收件人列表。此前遗漏此参数导致了cron任务虽然输出了日志但邮件发送状态异常的诡异问题。这个解决方案是作者在实际踩坑后总结出的独家经验。通过这一套替换,既保留了系统邮件通知的能力,又极大地简化了管理负担。

IT 2012-12-23 23:39:11 / 累计浏览 3,346

通过blktrace, debugfs分析磁盘IO

这篇讲的是当磁盘利用率飙到100%、程序变卡时,如何揪出背后的“元凶”文件。作者从实际场景出发,演示了如何组合使用blktrace和debugfs这两个工具,层层追查IO的来源。 具体来说,当iostat显示磁盘压力巨大时,先用blktrace捕获块设备层的IO请求。关键点在于grep出以“A”开头的日志行,这里是原始请求的入口,能清晰看到读写操作对应的源设备扇区。接着,通过debugfs的“icheck”命令,根据扇区号换算出的文件系统块号,反查到对应的inode号。最后,用“ncheck”命令把这个inode号映射为具体的文件路径——比如例子中的“test_file”。 整个流程就像顺藤摸瓜:从设备层的扇区,到文件系统的块和inode,最终定位到用户可见的文件。拿到这个结果后,就能结合自己的应用程序,分析为什么这个文件会被频繁读写,从而进行优化。文章给出了完整的命令示例和输出解读,实操性很强。

IT 2012-12-23 23:17:26 / 累计浏览 4,710

进程上下文切换 – 残酷的性能杀手(下)

这篇讲的是进程上下文切换如何成为性能杀手的实测篇。作者从自己开源的并发网络库chaos中选取task_service模块,通过编译宏控制,对比了pthread条件变量、sleep、pipe、socketpair、eventfd以及boost::io_service这几种线程间通信机制的实际表现。 测试数据清晰展示了不同机制的CS/s(每秒上下文切换次数)和整体耗时:pthread条件变量切换高达60万次且最慢,而eventfd的切换次数低至200次,效率遥遥领先。有趣的是,boost::io_service的CS也高达75万次,但整体效率却比pthread模型更好,作者推测这与其内部高效的队列实现有关。 结论很直接:上下文切换次数与程序运行效率基本呈反比,减少CS是优化后台服务性能时必须考量的关键因素。文章用硬核的实测数据说话,为开发者选择并发模型提供了切实参考。

IT 2012-12-23 23:03:36 / 累计浏览 8,502

你应该知道的16个Linux服务器监控命令

这篇讲的是Linux系统管理员必备的16个服务器监控命令。作者从追求最佳服务器性能的角度出发,强调了相比于GUI工具,命令行监控能更精准地洞察系统内部的真实状况。文章开篇就建议将服务器设置为运行级别3(纯命令行模式),以减少不必要的资源消耗。 随后,文章逐一介绍了从iostat、mpstat到netstat、top等16个核心命令。每个命令都附带了具体的用法示例和输出解读,例如用iostat快速定位潜在的IO瓶颈,通过free -m查看内存概况,使用mpstat分析多核CPU负载,以及利用netstat诊断网络连接状态。这不仅是一份命令清单,更是一套组合拳,帮助管理员全面掌握CPU、内存、磁盘IO和网络等关键指标的实际状况。 值得注意的是,文章没有停留在基础命令的罗列,还提及了如nmon这样集成了多种监控视图的工具,并说明了pmap、strace等用于深入排查特定进程问题的命令。对于希望从“救火队员”转变为能提前预见并解决问题的专业运维人员,这些基于命令行的监控技巧正是其核心能力所在。

IT 2012-12-18 22:57:48 / 累计浏览 3,833

ssh-copy-id帮你建立信任

对于运维人员来说,在两台Linux机器间建立SSH免密登录是常规操作,但传统手工步骤——拷贝公钥、编辑authorized_keys、检查文件权限——不仅繁琐,还容易在切换机器和手动编辑时出错。 这篇文章生动演示了如何用`ssh-copy-id`命令优雅地自动化这一过程。作者从最基础的需求出发,先遇到了“未找到标识”的错误,引出了必须先用`ssh-keygen`生成密钥对的关键前提。但更典型的坑在后面:当目标机器SSH端口不是默认22时,直接使用`-p`参数会无效,命令依然报“Connection refused”。 真正的解决方案带点“小技巧”色彩:需要将非标准端口和目标地址作为引号内的一个整体字符串传入,即执行`ssh-copy-id "-p 22000 nameB@machineB"`。这本质上是将参数传递给了底层的`ssh`命令。问题解决后,文章还揭示了`ssh-copy-id`本身只是一个约50行的Shell脚本,其源码可供学习。整个排查过程从问题到解决非常清晰,实用性强。

IT 2012-12-17 13:39:10 / 累计浏览 6,118

nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket

这篇讲的是如何解决高并发下PHP服务器因频繁创建TCP短连接导致的端口耗尽问题。作者从观察到的真实案例切入——服务器因大量TIME_WAIT状态堆积,耗尽了可用端口,导致新建连接失败。常见的“缩短2MSL时间”的方案治标不治本,因此他引导读者思考更优的解法。 文章核心对比了Nginx与PHP-FPM之间的两种通信方式:默认的TCP socket和Unix Domain Socket(UDS)。作者结合一个WebGame的架构实例指出,当Nginx与PHP-FPM部署在同一台服务器时,使用TCP socket(尤其是短连接模式)会因经过完整的网络协议栈而产生不必要的系统开销,并引发上述的端口问题。相比之下,Unix Domain Socket绕过了TCP/IP层,直接在内核中通过文件套接字通信,大幅降低了连接建立与销毁的开销,从根本上避免了端口竞争。 文章最终给出的结论很明确:对于同机部署的Nginx与PHP-FPM,切换到Unix Domain Socket通常是更优的选择,它能提升效率并彻底解决因短连接导致的资源瓶颈。这对运维和后端开发人员优化本地服务通信有直接的参考价值。

IT 2012-12-17 13:34:22 / 累计浏览 1,811

php5.3.8中编译pdo_mysql的艰难历程

这篇讲的是在CentOS 6.5服务器上,一个被临时委以重任的程序员,如何攻克PHP 5.3.8环境下PDO_MYSQL扩展编译失败的故事。问题出在新服务器迁移时,运维同事已经成功编译了PHP本身,但随后独立编译PDO_MYSQL扩展却屡屡受挫。作者在描述中给出了具体的系统版本和复杂的PHP编译参数,为问题复现提供了清晰的环境背景。 通常,这类编译失败往往与MySQL客户端库的路径配置、头文件缺失或依赖关系错配有关。在“艰难历程”中,作者大概率是通过检查phpize的输出、定位configure脚本报错信息,最终发现可能是编译PHP时未正确启用或指定MySQL相关参数,导致扩展无法找到依赖。解决过程可能涉及回溯PHP的编译配置、手动指定`--with-pdo-mysql`路径或确保相关的开发包已安装。 这个案例的价值在于,它真实还原了一个非专业运维在压力环境下,通过排错日志、理解编译参数间的关联,最终解决问题的完整思路。对于需要在旧版PHP环境(如5.3.x)中进行扩展编译的开发者,文中对具体报错点和调试步骤的记录,提供了直接的参考线索。

IT 2012-12-17 13:32:00 / 累计浏览 1,944

gitolite的README译文

这篇讲的是如何从零开始搭建和配置Gitolite,来搭建一个轻量级的Git托管服务器。作者从Gitolite的架构讲起,明确了服务器端和客户端的角色划分,以及少数管理员与普通用户的权限差异。 核心部分围绕三个环节展开:首先是安装,作者详细列出了所需的软件环境(如Git、Perl、SSH),并给出了非常具体的安装命令。特别贴心的是,提到了一个常见的Perl模块缺失报错及其解决办法,这是很多初学者会卡住的地方。其次是核心的权限管理,文章解释了通过一个名为`gitolite-admin`的特殊仓库来集中管理用户公钥(`keydir`文件夹)和仓库权限配置(`gitolite.conf`文件),管理员只需在客户端编辑配置并推送,服务器就会自动生效。最后简要说明了如何为用户开通访问权限。 整篇文章就像一份简洁的实战手册,将原本可能有些复杂的权限管理,通过Git本身的流程(克隆、编辑、推送)变得清晰直观。它不仅帮你装好工具,更重要的是让你理解了背后的设计逻辑——把服务器管理变成了对一个Git仓库的协作。

IT 2012-12-13 13:35:57 / 累计浏览 3,630

linux 定期自动备份mysql的shell

这篇讲的是,一位作者从保障用户数据安全的实际需求出发,分享了一个简洁实用的MySQL自动备份方案。 他编写了一个Shell脚本,核心是利用`mysqldump`工具导出服务器上所有的数据库,并通过管道用`gzip`进行高压缩存储。脚本通过配置`crontab`定时任务,设定在每天凌晨3点自动执行,实现了完全无人值守的备份流程。 方案的一个关键设计在于备份文件的自动轮转清理。脚本采用目录轮转的方式(`backup.0`至`backup.4`),每次执行前会先删除最旧的一天备份,然后生成新的备份文件,从而确保服务器磁盘空间始终只被最近5天的备份占用,避免了存储空间无限增长的问题。 文章直接提供了完整的脚本代码,包括数据库连接信息、文件路径定义和命令组合等,读者可以根据自身环境稍作修改后直接使用。作者也提醒,从安全角度考虑,执行备份的脚本应使用Root权限,这提醒了读者在自动化运维中需兼顾权限管理。整个方案轻量、可靠,非常适合中小型项目或个人服务器进行日常数据保护。

IT 2012-12-13 13:33:54 / 累计浏览 3,934

一个 Lua 内存泄露检查工具

这篇讲的是作者团队遇到服务器内存一夜暴增8G的紧急情况,通过快速自制的Lua内存快照工具定位泄露的故事。 问题出在一张地图的Lua State中,有对象持续生成却未释放引用。作者懒得搜索现有工具,自己用半天时间写了一个名为“snapshot”的开源库。它的巧妙之处在于:不对整个Lua State序列化,而是只记录table、thread等复杂对象间的引用关系,并且用C直接调用API遍历,避免了用Lua实现时“观察即改变”的干扰。 核心方法是对比两个时间点的快照,新增的内存和其引用链一目了然。工具返回的虽然是一堆指针和字符串,但足够定位到具体是哪行代码的哪个变量导致了泄露,比如示例中清晰地指向了dump.lua第7行的tmp和S1变量。 这个临时工具已经成功帮他们快速锁定了故障点,展示了在紧急问题下“轮子虽小但能快速解决问题”的实用主义思路。

IT 2012-12-11 13:32:03 / 累计浏览 2,768

关于两种限流模式

这篇讲的是高并发系统中两种主流的限流模式:滑窗模式与响应模式。滑窗模式是“事后统计”,通过检查过去多个单位时间窗口内的请求总量是否超标来决定是否放行。它的实现像一个环形计数器数组,逻辑直观,但阈值设定依赖经验或压测,且可能因单位时间请求分布不均导致“先松后紧”。文章指出,它更适合作为对单一资源(如数据库、特定API)的刚性保护承诺。 而响应模式则是一种“实时反馈”策略,它只关心当前正在处理的请求数。文章巧妙地指出了限流的根本目的——是保护系统资源不被拖垮。由于系统容量会受GC、依赖抖动等动态因素影响,响应模式通过公式(QPS/1000*RT)动态计算最大并发数,让限流阈值能随系统实际承载能力自动调整,展现了更强的适应性。 文章最后对比了二者的实现思路:滑窗模式基于数组和环形队列记录历史计数;响应模式则仅需一个原子计数器跟踪活跃请求数。这为在确定性资源保护和自适应系统保护两种场景下的选型提供了清晰的技术参考。

IT 2012-12-09 20:07:42 / 累计浏览 2,248

前后端应用平滑发布方案设计

在大型网站的前后端分离架构中,如何让不兼容的代码更新平滑生效是个常见痛点。本文从这一实际问题出发,分享了一套经过实践验证的自动化发布方案。 核心思路是:发布时先上线前端代码,并使其与旧版本线上共存,再控制后端服务切换引用。具体实现依赖两个关键技术:一是通过动态合并服务为CSS/JS文件生成多版本物理文件,实现前端资源的增量发布;二是后端模板的引用路径更新时机,由发布系统根据应用是否处于“锁定状态”来自动判断——非锁定时立即更新,锁定时则在服务重启时统一刷新。 这套设计巧妙地利用了现有的发布流程,无需开发者额外操作,就解决了因集群部署耗时造成的发布窗口期异常。它在保证代码简洁和发布独立性的同时,实现了对用户完全透明、零感知的平滑过渡,为高可用站点的持续交付提供了一个不错的参考模型。

IT 2012-12-07 23:46:50 / 累计浏览 2,168

监视文件系统变化——inotify

这篇讲的是如何为PHP常驻进程实现“代码热更新”的一个解决方案。当PHP以常驻内存模式运行时(比如执行后台任务或伺服服务),它失去了传统web模式下每次请求自动加载最新代码的能力。文章指出,在这种场景下,可以利用Linux内核提供的inotify机制来监听文件系统的变化。 文章详细解释了inotify的工作原理:它通过一个类似队列的系统,使用少量几个API函数(如初始化、添加监控、读取事件)来捕获指定目录或文件的创建、修改、删除、移动等各类事件。作者也提到了一些实用细节,比如inotify本身不支持目录递归监控,需要手动添加子目录,以及在虚拟机共享文件夹中可能存在的限制。 为了更直观地展示应用,文章最后提供了一个名为DirWatcher的PHP类示例代码。这个类封装了监控逻辑,允许开发者注册监控目标和对应的回调函数,从而在文件系统发生特定变化时自动触发执行动作。对于需要实现动态加载配置、自动部署或插件热替换的服务器端PHP应用来说,这是一个实用且底层的技术思路。

IT 2012-12-07 23:43:29 / 累计浏览 3,629

总结一下遇到过的网络同步IO导致服务阻塞的问题

这篇讲的是作者在工作中亲身遭遇的两个因同步IO引发服务阻塞的典型问题。第一个场景是fri_svr服务需要向第三方平台(如人人、Facebook)批量拉取用户数据,由于整个HTTP请求/响应周期过长(1s-10s),当并发请求量升高时,按user_id哈希分配的专用线程队列会发生堆积,直接导致服务内存暴涨并无法及时响应前端。 第二个场景则发生在使用ICE同步RPC的数据服务上。作者发现,某个线程队列中只要有一个任务(对应某个用户的请求)被意外阻塞,后续同队列的所有任务都会被拖累,导致部分用户响应延迟几分钟。而哈希到其他队列的用户则不受影响。 为了解决问题,作者将线程模型从“一个线程对应一个队列”调整为传统的线程池(多线程对应一个队列),从而避免了单点阻塞的连锁反应。但核心挑战在于保证同一用户(拥有相同owner)任务的执行顺序。作者设计了一个线程安全的数据结构:内部维护任务队列和一个KV表来记录每个owner是否正在被处理。任务被取出时,会检查并锁定owner状态,从而确保后续任务不会被乱序执行。 作者最后也指出,这种方案会引入额外的check/set开销与线程竞争。如果任务都是执行时间可控的CPU密集型任务,那么最初的一对一线程队列模型可能仍是更优选择。

IT 2012-12-07 13:54:53 / 累计浏览 3,657

玩转CPU Topology

这篇讲的是CPU拓扑结构,作者从NUMA和SMP的概念对比切入,深入解释了现代多处理器系统的设计逻辑——NUMA架构中内存访问时间因位置而异,本地内存访问更快,而SMP则让所有处理器共享同一内存,适用于规模较小的系统。文章接着梳理了Socket(物理CPU封装)、Core(处理器核心)和Logical Processor(通过超线程技术虚拟的逻辑核心)之间的关系:一个NUMA节点包含多个Socket,每个Socket集成了多个Core,开启超线程后,操作系统会将每个Core视为两个Logical Processor,从而提升任务并行度。 作者以一台Red Hat Enterprise Linux 5.4系统为例,演示了如何实际查看这些拓扑信息。例如,使用numactl -hardware命令可以获取NUMA节点数量、内存大小和访问成本(本地访问成本10 vs 跨节点访问成本20);通过/sys/devices/system/node/目录能深入查看节点细节;对于Socket和Core,/proc/cpuinfo中的physical id和core id字段提供了关键数据——该系统有两个Socket,每个Socket有四个Core,开启HT后逻辑处理器数量从8个增至16个。文章还指出,CPU缓存(Cache)的详细信息需要通过sysfs获取,而cpuinfo中的cache size可能不够

IT 2012-12-05 13:02:05 / 累计浏览 3,691

用pigz代替gzip

这篇讲的是一个名为pigz的并行压缩工具,作者通过实际测试,展示了它相比传统gzip在现代多核处理器上的巨大性能优势。 pigz的核心是利用多线程并发执行gzip算法。文章用两组大文件(约2.3GB和5.2GB)的压缩解压测试数据做了直观对比。结果显示,pigz在默认线程数下,压缩速度可达gzip的5.3倍。例如,压缩那个5.2GB的文件,pigz默认配置耗时1分12秒,而gzip则需要超过6分钟。解压缩同样快了一倍以上。虽然pigz会消耗更多CPU资源,但压缩比与gzip相当。 文章还深入分析了线程数与性能的关系。实测表明,从4线程增加到8线程能带来约41%的速度提升,但从8线程增加到16线程提升降至28%左右,而32线程对比16线程仅提升3%,存在明显的边际效益递减。 因此,结论很明确:在需要快速压缩大文件、且能接受短时间高CPU负载的场景下,pigz是一个能极大提升工作效率的替代方案。

IT 2012-11-27 13:47:48 / 累计浏览 2,909

用Bloom Filter的方式统计网络流量

作者从网站面临爬虫攻击和恶意访问的现实问题出发,想要高效统计每个IP的日访问量以识别机器人。传统的Map计数法可能消耗数百兆内存,而文章介绍了一种基于Bloom Filter思想的变体算法,可以在极低的内存占用(O(1)空间复杂度)下完成计数。 这个方案的核心是使用一个二维数组和多个独立的哈希函数。每次访问到来时,不是增加所有对应位置的计数器,而是只增加这m个计数器中值最小的那一个。这种方法巧妙地将Bloom Filter的“是否存在”判断,扩展为了“计数”的近似统计。当然,它继承了Bloom Filter可能存在的假阳性特点——可能误判某些低频IP为机器人,但可以通过调整数组大小和哈希函数数量来控制误差率。 文章还由此类比了《编程之美》中一个经典的微软面试题,并进一步提出了扩展问题:如果要统计的不是访问次数,而是IP的入/出流量,该如何设计算法?这为读者提供了更广阔的思考空间。

IT 2012-11-27 13:36:42 / 累计浏览 3,777

HBase如何合理设置客户端Write Buffer

这篇技术博客从实战角度出发,深入剖析了HBase客户端的Write Buffer机制。文章指出,每次单条Put都会引发一次网络往返(RTT),在数据量小、RTT较高的场景下,这个开销会成为性能瓶颈。通过开启Write Buffer进行批量提交,可以将N次RTT降低为一次,从而显著提升写入吞吐。 作者没有停留在概念介绍,而是结合HBase源码,揭示了底层实现细节:客户端会先按Region Server将Put对象分组打包,再统一发起RPC请求。文章还详细拆解了Write Buffer的触发条件(如autoFlush设置、缓冲区满),并给出了单个Put对象大小的预估公式 `((50~60) + L1) * N + L2 bytes`,帮助开发者根据自身数据特征(列数N、RowKey长度L1、Value长度L2)来预估并合理配置缓冲区大小。 最终,文章清晰地划分了适用场景:对于KB级别的小数据写入,调整Write Buffer收益明显;而对于MB级别的大记录,由于数据传输时间占主导,则不建议依赖此机制。这种从原理到源码再到实践的分析路径,为调优HBase写入性能提供了扎实的依据。