误删大文件的一个可能解救办法
这篇讲的是作者在服务器上误删一个10GB大文件后,如何利用Linux文件系统特性紧急抢救的过程。 当时作者正在对镜像文件计算md5校验和,另一个窗口误操作执行了rm删除。好在大文件删除需要时间,作者迅速暂停了md5sum进程。关键点在于:Linux系统中,只要还有进程打开并占用着这个文件,即便已执行rm命令,文件数据也不会被立即清除。 通过查看被暂停进程(PID 30888)在/proc文件系统中的文件描述符,作者找到了那个指向“已删除”文件的链接(/proc/30888/fd/3)。最后用简单的cp命令,就成功将文件内容复制出来保存为save.img,完成了数据恢复。 文章还补充道,对于文本文件可以用grep尝试恢复,而exe、图片等二进制文件则可借助TestDisk、PhotoRec等专业工具。整个过程清晰地展示了Linux文件删除的底层逻辑和一个实用的应急技巧。
使用tar+lz4/pigz+ssh更快的数据传输
这篇讲的是,如何通过压缩管道来突破服务器间大文件传输的速度瓶颈。作者在之前优化SCP速度的基础上,进一步测试了结合不同压缩算法与SSH的方案。 核心对比了lz4与pigz这两种高速压缩工具。在“打包-压缩-传输-解压-拆包”这一完整流程中,解压速度是最大的性能短板。lz4虽然在压缩率上略逊于pigz,但其解压速度达到了惊人的264MB/s,是gunzip的三倍,这使它在需要即时解压的传输场景中成为关键。 实测结果显示,使用 `tar | lz4 -B4 | ssh` 的组合,传输速度从原始SCP的约40MB/s提升到了249MB/s。这意味着原本需要3小时的400GB数据迁移,现在仅需27分钟。文章不仅给出了最终可用的命令行方案,还分析了磁盘IO、网络带宽及管道开销等各环节的实际表现,并发现了调整lz4块大小(-B4)能对性能产生显著影响。对于运维和开发人员来说,这是一个非常实用且经过验证的加速技巧。
服务器运维:怎样优雅地切割log
这篇讲的是如何优雅地处理服务器日志切割的问题。作者从运维人员常遇到的困境出发,先吐槽了手动移动日志文件的粗暴方式及其风险,接着介绍了写空日志的改良方法,最终引出真正的解决方案——专用的logrotate工具。 文章的核心在于,它不仅推荐了工具,更结合实际生产环境给出了配置思路。作者指出,简单的每日切割在高流量场景下会暴露新问题,比如压缩大量日志时可能瞬间占满CPU,影响服务响应。因此,他提出了一系列具体的优化建议:预估日志产生量、规划存储周期、谨慎评估是否压缩,并在必须压缩时,可以使用taskset和nice指令来分配CPU资源,避免影响业务进程。此外,针对单日志文件过大的情况,文章也提出了按大小或按小时切割的策略。 整篇文章用平实的语言,将日志管理从“能用”提升到了“好用且稳健”的层面,给出了从工具选择到参数调优的完整思考路径。
Windows主机的性能监控
在运维实践中,清晰了解承载业务的Windows主机状态,是保障上层应用(如SQL Server)稳定运行的基础。这篇文章系统性地梳理了如何利用PowerShell和perfmon两大工具,对Windows主机进行全面的性能监控。 作者从“工欲善其事,必先利其器”出发,详细介绍了如何使用PowerShell的`Get-Counter`和`Get-WmiObject`命令,来获取和计算各类性能计数器数据。文章的核心价值在于,它没有停留在列举指标,而是深入剖析了CPU、存储、内存、网络这四个关键维度的核心Metrics。 对于每个指标,例如CPU使用率、磁盘响应时间、内存页交换等,都提供了具体的PowerShell获取命令、含义解释以及计算逻辑。更进一步,文章还探讨了监控实践中可能遇到的陷阱,比如采集粒度不足导致问题被掩盖,并讨论了在大规模集群下,采用Push(Agent主动上报)或Pull(中心节点拉取)模式对监控数据精确度和系统开销的影响。 整体而言,这不仅是一份监控指标速查手册,更是一份从工具使用到指标解读,再到采集策略思考的实践指南。
yunbk-让备份变得更简单
还在为数据库和文件备份的手动操作感到繁琐吗?作者用 Python 开发了 yunbk 这个简洁的备份插件,让数据备份变得像写几行代码一样简单。它的核心思路是通过一个统一的 `with` 上下文管理器,在临时目录中完成所有备份文件的写入,调用 `backup()` 后便自动上传至配置的后端存储,最后彻底清理现场,不留痕迹。 这个插件最大的优点是灵活性和易用性。通过提供本地、FTP、阿里 OSS 等多种后端适配器,开发者可以轻松地将 MySQL、Redis 等数据库,或是任意媒体目录备份到不同位置。文章中给出了几个清晰的代码示例,比如仅需几行就能完成 MySQL 全库的本地备份。作者还推荐结合 APScheduler 实现定时自动化备份,给出了一个完整的调度脚本,让整个备份方案更加实用和落地。
用 LEK 组合处理 Nginx 访问日志
这篇讲的是作者在使用 Logstash 处理 Tengine/Nginx 通过 syslog 发送的访问日志时,遇到的几个实际性能瓶颈及优化方案。文章首先指出,在高压力下 Logstash 的 Grok 插件容易成为瓶颈,因此作者建议在日志格式可控时,优先考虑用分隔符格式配合 Ruby 脚本或自定义 LogFormat 来替代 Grok 解析。 然而真正的坑在后面:运行后发现日志接收带宽异常低,排查发现是 Logstash 的 syslog input 插件采用了单线程 UDP 监听,导致接收队列(Recv-Q)持续堆积。作者对比了 Fluentd 的异步实现,并考虑到 Logstash 基于 JRuby 的扩展复杂性,最终选择了一个更直接的方案:用 Perl 的高性能 AnyEvent 库重写了一个专门的异步日志收集脚本。这个脚本同样将日志输出为 Elasticsearch 兼容格式,使得原有的 Kibana 仪表盘无需任何改动。最终效果立竿见影,日志接收带宽从瓶颈时的 60 MBps 恢复到了正常的 300 MBps。
core dump磁盘报警问题排查过程
这篇讲的是线上服务器磁盘突然报警的排查过程。作者从玩客项目一台机器分区占用超80%的告警入手,发现同批次其他机器都正常。 通过 `find` 命令查找大于100M的文件,发现大量 `core.数字` 格式的文件,锁定了磁盘占用的元凶——core dump文件堆积。进一步用 `gdb` 分析其中一个core文件,明确是 php-fpm 进程(pool www)产生的崩溃转储。 问题根因在于系统的 `core file size` 限制被设为 `unlimited`。通过检查 `/etc/security/limits.conf`,确实存在 `* soft core unlimited` 和 `* hard core unlimited` 的配置,导致php-fpm崩溃时会无限制地生成core dump文件。作者注释掉相关配置并重启php-fpm后,成功将core file size soft limit置为0,从源头禁止了生成。最后删除已有的core文件,将磁盘占用降至50%左右。 一个实用的细节是,文章结尾提醒,有时即便在 `limits.conf` 中看到core设为unlimited,但通过 `ulimit -a` 查看实际生效的可能仍是0,排查时需注意。
OS X 支持 NTFS 读写
这篇讲的是如何用系统原生的方式,让 Mac 对 NTFS 格式的硬盘支持读写功能。作者从一个常见情况切入:明明 OS X 内核支持 NTFS 读写,但系统默认却只以只读模式挂载,导致很多用户需要借助第三方软件才能向 NTFS 分区写入数据。 文章的核心方案是直接修改系统自带的挂载脚本。通过 root 权限将原始的 `mount_ntfs` 程序重命名,并创建一个新的脚本文件,在其中调用原始程序并强制添加读写(`rw`)参数。这个方法绕过了第三方工具,利用了系统自身潜藏的能力。 作者在最后也提醒了两个实操要点:一是建议 NTFS 分区最好设置卷标,避免因默认的“未命名磁盘”导致挂载失败;二是指出网上流传的添加 `nobrowse` 参数的做法其实多此一举,正确理解 `-o` 参数的含义后,完全可以让分区正常显示在 Finder 侧边栏,无需额外折腾。整个方案简洁直接,适合希望用最小改动实现原生读写的 Mac 用户参考。
Oracle数据库升级迁移、SPA及统计信息
作者从一次真实的升级迁移讲起:某省级电信运营商将核心CRM系统的Oracle数据库,从IBM小型机上的10g RAC迁移至x86+VMware平台的11g RAC,成本降至十分之一。这引出了一个关键的后续问题:新系统上线后,应采用何种统计信息收集策略? 文章对比了两种方案:迁移旧库统计信息或在新库自动收集。作者团队最终选择了后者,原因是11gR2的自动收集机制已相对完善,且能为后续运维降低风险。但如何确保这一策略在上线时就安全可用?答案在于利用SPA(SQL性能分析器)。 团队使用了生产库三个时段及一个月AWR中的全部SQL,在新库上跑SPA测试。在测试前,先用`dbms_stats.gather_database_stats(options=>'gather auto')`执行一次增量收集。然而,直接这样做会导致新库的直方图信息严重缺失,因为自动收集依赖`col_usage$`表,而新库此表为空。解决方法是在SPA测试过程中,通过执行足够多的SQL来“喂饱”`col_usage$`,让系统“记住”哪些列需要被关注。最终,基于SPA的测试结果,用数十个SQL Profile固化了风险计划,保障了系统平稳上线。 这篇分享的价值在于,它清晰地展示了在大型跨版本迁移中,如何通过组合使用SPA和自动统计信息收集策略,来系统性规避性能风险,而不仅仅是凭经验手工调优。
VirtualBox 虚拟机镜像文件 UUID 已存在问题
这篇讲的是VirtualBox使用中的一个常见陷阱:当你想把一个已用过的虚拟机镜像文件拷贝到另一台电脑时,VirtualBox会报错“UUID已存在”,阻止你直接加载。问题的根因在于,镜像文件自带的唯一识别码(UUID)已在原电脑的VirtualBox环境中注册过,系统不允许重复。 文章作者亲身从USB盘加载虚拟机时碰到了这个坑。界面选项里找不到解决办法,但作者记起命令行可以搞定。具体的修复步骤是:打开终端,进入VirtualBox的安装目录,然后使用 `VBoxManage internalcommands sethduuid` 命令,紧跟VDI镜像文件的路径,为它重新生成一个全新的UUID。执行成功后,再新建虚拟机加载这个镜像文件,就能顺利运行了。 对于经常迁移虚拟机环境的技术人员来说,这个用命令行“重置身份证”的小技巧很实用,能快速绕过这个报错,省去重新导出导入的麻烦。
在 Perl6 脚本中并发执行 ssh 命令
这篇讲的是作者在 Perl6 中并发执行 SSH 命令时的一次实战尝试。由于找不到合适的现有模块,且底层 C 库不兼容其 Kerberos 认证环境,作者决定绕开高层并发 API(如 Promise/Supply),直接使用更底层的 Thread 和 Channel 来实现。 文章围绕一个简洁的 OpenSSH 类展开,展示了如何通过多方法实现单个主机与多主机的命令执行。作者特别指出,虽然 Perl6 宣传了高级并发模型,但 API 迭代较快,有时选择更稳定的底层原语反而更可靠。 代码示例串联了不少 Perl6 语法点:类的属性定义、字符串连接符 `~`、用于捕获错误的 `try`/`CATCH`、执行系统命令的 `qqx{}`,以及 `>>` 操作符在数组上的线程化 finish 操作。作者也坦诚,示例代码较为简陋,例如依赖密钥登录且未使用线程池调度。 整体来看,这是一份结合了具体需求、实现思路与语法讲解的笔记,既分享了在 Perl6 中集成系统命令与并发控制的方法,也客观分析了语言特性在实际场景下的应用考量。
记我配置Nginx代理的遭遇
这篇讲的是作者自认熟悉Nginx,却在配置一个简单的代理转发时连踩五个大坑的曲折经历。 核心任务是将形如 `/search/lamp` 的请求,代理到新服务并转换为 `/search?q=lamp` 的参数格式。作者从最直接的正则捕获与变量拼接方案开始尝试,但首次运行就遇到了“未定义resolver”的经典报错。根因在于代理地址中使用了变量时,必须显式配置DNS解析器。 作者不喜欢硬编码resolver,于是尝试移除变量,却立即触发第二个限制:在正则表达式定义的location块内,`proxy_pass` 指令不允许包含URI。被迫改用 `rewrite` 重写请求URI后,又遭遇变量作用域问题,正则捕获的变量无法直接在 `rewrite` 中使用。 借助社区提醒,通过 `set` 指令中转变量解决了传递问题,但这并非终点——新的问题是正则匹配会自动解码URL,导致传参错误。最终,作者通过使用 `$request_uri` 变量获取原始未解码的URI,并配合 `if` 指令进行条件判断,才在第五次尝试中成功搞定。这篇文章生动演示了Nginx配置中变量、位置块与指令之间复杂的相互作用,对避开这些“老坑”有直接的参考价值。
配置 Nginx 子域名的泛解析
这篇文章讲的是如何配置 Nginx 实现子域名的泛解析,让所有形如 `sub.domain.com` 的子域名请求都能被正确处理。作者从实际需求出发:希望在不破坏主域名(`domain.com` 和 `www.domain.com`)访问的前提下,让不同的子域名自动映射到服务器上对应的目录(例如 `sub` 映射到 `www-sub` 目录)。 核心方案十分巧妙:在 Nginx 配置的 `server_name` 指令中直接使用通配符 `*.domain.com` 来承接所有子域名请求。然后,通过一个正则表达式动态提取主机名中的子域名部分,并将其存入变量 `$subdomain`。最终,在 `root` 路径的定义中拼接这个变量,例如 `root /home/user/www$subdomain/;`。这样一来,访问 `blog.domain.com` 时,网站根目录就会自动指向 `/home/user/www-blog/`。 这个方案的亮点在于“动态路径映射”,避免了为每一个子域名单独编写 `server` 块的繁琐配置。作者也特意说明了正则中排除 `www` 的逻辑,确保主域名配置不受干扰。整体思路简洁高效,对于需要管理大量子域名的开发者来说,是一个非常实用的配置模板。
Google 网页爬虫报告无法连接站点解决办法
这篇文章解决了一个挺让人头疼的实操问题:站长频繁收到 Google 站点地图警报,称 Googlebot 无法连接自己的网站,担心站点索引会被删除。 作者起初很困惑,因为他的网站服务器托管在香港,理论上不存在连接障碍。经过排查和咨询,问题根源被锁定在了正在使用的国内某知名免费 DNS 服务上。疑似该服务商出于商业策略,在境外访问上做了限制,导致 Google 爬虫无法稳定解析域名。 为了解决这个突发故障,作者没有简单地更换 DNS 服务商,而是提出了一个更稳健的方案:同时在 GoDaddy 上注册并启用两家 DNS 服务的解析服务器,将它们分别配置为域名的主、备 NS 服务器。这样做的精妙之处在于,它形成了一个解析冗余。通过 `dig +trace` 命令验证,DNS 查询结果有时从第一家服务商返回,有时从第二家返回。这意味着,当其中一家服务出现访问问题时,Google 爬虫还有机会通过另一家完成解析,从而避免了全天候无法抓取的极端情况,有效保护了站点的搜索可见性。 这个方案虽然违背了服务商的建议,但在实际测试中证明了其有效性,在解析速度和连接稳定性之间取得了理想的平衡。
RDS典型客户工单——空间问题
这篇直击RDS运维中让人头疼的磁盘空间问题,它并非泛泛而谈理论,而是直接从一个个真实的客户工单切入,抽丝剥茧地分析典型场景。文章系统梳理了七大类空间异常情况,从临时表与日志文件膨胀导致的“飙升”,到磁盘超限触发实例只读锁定,再到新手常遇到的“未用先满”疑惑,以及因大字段或本地迁移引入的隐形空间消耗。 针对每个问题,都给出了明确的根因,比如使用临时表的低效SQL、未及时清理的binlog、SQL Server大字段对日志的放大效应,并提供了具体的排查与解决路径,例如创建索引避免临时表、清理binlog、调整字段大小或升级数据库版本以优化undo日志回收。文章特别提到了一个因binlog累积与排序操作叠加导致空间暴涨的综合案例,展现了问题排查的复杂性。 对于开发者和运维人员来说,这篇文章像一份实用的故障排查手册,把那些看似突发的空间锁定问题拆解成了可诊断、可预防的具体技术点,能帮助大家快速定位并解决生产环境中的类似棘手问题。
全平台大文件断点续传上传技术 ( 开源项目 Stream )
这篇讲的是一个名为Stream的开源项目,旨在解决全平台大文件断点续传上传的难题。背景是传统上传方案在不同浏览器中兼容性差,大文件传输时容易中断或失败。Stream的核心方案是同时支持HTML5和Flash两种上传方式,实现了跨域上传、多文件上传、断点续传和拖拽等新特性,兼容IE7+、Firefox 3.6+、Chrome、Safari4+等主流浏览器,为开发者提供了一个全功能的上传平台。 作者在Stream基础上,用Perl的Mojolicious框架实现了后端接口。这个后端采用异步流式处理,单进程就能高效处理多个上传请求,内存占用极低。配置方面,只需调整StreamUpload.conf文件中的端口、存储目录和跨域域名等参数,然后通过hypnotoad启动服务器即可运行。整个方案从兼容性到性能都经过优化,展示了一个实用且易于部署的大文件上传解决方案。
在 Django/Flask 开发服务器上使用 HTTPS
这篇讲的是,如何在 Django 或 Flask 的开发服务器上,提前实现并测试 HTTPS 连接,而无需等待部署到生产环境。 作者指出,框架自带的开发服务器默认不支持 HTTPS,这给需要在本地验证加密通信的开发者带来了不便。为了解决这个问题,文章引入了 **stunnel** 这个外部工具。stunnel 的核心作用是充当一个“加密翻译”,它监听 HTTPS 请求(如443端口),解密后转发给实际运行的 Django/Flask 服务(如8000端口),再将响应加密返回,从而为开发服务器“套上”一个安全通道。 文章详细给出了实现步骤:首先在系统中安装 stunnel;其次,使用 OpenSSL 命令生成一个用于测试的自签名证书;然后,编写一个简单的 stunnel 配置文件,定义监听与转发的端口;最后,分别启动 stunnel 服务和 Django/Flask 开发服务器。值得注意的是,针对 Django 需要设置环境变量,而 Flask 则只需指定相同的监听端口即可。 整体方案简洁实用,它通过一个轻量的外部组件巧妙地绕过了开发服务器的限制,让开发者能在本地完整模拟 HTTPS 环境,方便调试 Cookie、重定向等与安全协议相关的问题。
修改 Mac 的 MAC 地址
这篇讲的是如何通过修改 MAC 地址来应对特定的网络管理策略。作者从学校环境下下载资源时,IP 乃至物理网卡 MAC 地址被封禁的常见困境出发,引出了解决这一问题的核心方法:使用一行命令临时更换 Mac 的 Wi-Fi 接口 MAC 地址。文中具体介绍了通过 `ifconfig` 与 `openssl` 命令随机生成并应用新地址的操作,同时点明了苹果在 iOS 8 上引入 MAC 地址随机化功能,用于在公共 Wi-Fi 环境下保护用户隐私的背景。 该方案的巧妙之处在于其极简性与临时性——一行命令即可生效,且无需复杂设置;由于未写入启动项,系统重启后便自动恢复真实地址,这既满足了临时绕过限制的需求,也保证了系统日常使用的纯净与稳定。对于需要在外使用公共网络的用户,作者也顺带提醒了搭配 VPN 的安全建议。
linux下boot空间不足解决方法
这篇解决了一个常见的Linux系统痛点:当初为/boot分配了500MB独立分区,但随着多次系统升级,旧内核不断累积,最终导致空间耗尽、升级失败。 文章作者从实际遭遇出发,先展示了`/boot`目录下堆积的旧内核文件(如vmlinuz、initrd.img等),并通过`uname -a`确认当前运行的内核版本。核心解决方案是使用`apt-get remove`命令有选择地卸载旧版本内核。作者特别提醒,刚升级的新版本可能不稳定,建议保留1-2个旧版本以备回退。 文中通过`dpkg`命令列出了已安装的所有内核镜像包,然后演示了如何移除一个旧内核(linux-image-2.6.35-25-generic),并展示了操作完成后GRUB引导菜单自动重建的过程。最终,通过`df`命令验证,/boot分区成功释放出35MB空间(整个操作可释放约139MB),系统得以恢复正常升级。对于卸载后残留的“deinstall”状态,文章指出重启后再次执行卸载命令即可彻底清理。
在一个列表里选定主机名后直接 SSH 登陆
运维或开发人员常会遇到这样的场景:即使有配置管理工具,仍免不了需要手动SSH登录单台服务器排查问题。反复查IP、复制、切换窗口的操作既繁琐又容易出错。 这篇文章介绍了一个简洁实用的解决方案:一个名为warp的Bash脚本。它的核心思路很直接——将常用服务器的主机名或IP地址整理在一个文本文件中,通过运行脚本即可调用Vi/Vim进行选择式登录。用户只需在列表中上下移动光标,按下回车便能自动完成连接,省去了手动输入的麻烦。 warp的设计亮点在于其灵活性。配置文件格式自由,支持使用注释(如“#”或“--”)对服务器进行分组和说明,既清晰又便于维护。工具本身仅是一小段脚本,无需复杂安装。更巧妙的是,如果同时选中多行,它还能配合csshx工具实现批量操作,进一步提升效率。 这种将机械性操作自动化的思路,虽然工具简单,却能有效优化日常工作流,减少重复劳动。对于经常需要管理多台服务器的团队来说,是个不错的效率小工具。