加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.023zz.com.cn/)- 高性能计算、物联设备、数据可视化、操作系统、基础存储!
当前位置: 首页 > 综合聚焦 > 资源网站 > 空间 > 正文

空间扩容无效?90%存储浪费藏于这3大技术盲区

发布时间:2026-11-03 08:25:42 所属栏目:空间 来源:DaWei
导读:  去年一月份,凌晨三点二十,机房空调坏了半边,嗡嗡声像台老拖拉机在耳道里犁地。我盯着监控屏右下角那个贴了三回胶布的告警灯——蓝的,不是红的,但压根没闪。值班室泡面桶堆在服务器机柜缝里,汤汁凝成淡黄色油膜。客服小

  去年一月份,凌晨三点二十,机房空调坏了半边,嗡嗡声像台老拖拉机在耳道里犁地。我盯着监控屏右下角那个贴了三回胶布的告警灯——蓝的,不是红的,但压根没闪。值班室泡面桶堆在服务器机柜缝里,汤汁凝成淡黄色油膜。客服小张电话打进来时我正用指甲刮那层油:“姐,您确认下是不是‘存储扩容’按钮点了两遍?系统日志里显示成功了……”


文章配图,仅供参考

  我原以为是磁盘IO打穿了底层,结果扫完iostat、df -h、lsof -nP | grep deleted,发现/dev/sdb1用了87%,可里面全是/tmp/.nfs000000000b3c4a2d00000001这种鬼文件名。删不掉。rm -f报“device busy”。重启nfs客户端?不行,主从同步卡在binlog.000089,位点停在凌晨一点十七分。这时候老板在运维大群里发了个截图:扩容后空间还是红的,后面跟了个问号表情,再后面是“谁动的配置?”


  第一个盲区:DNS缓存毒化进日志轮转。不是你猜的TTL设太长,是logrotate脚本里写了rotate 365,但没配copytruncate,每次rotate都fork一个新进程去写旧inode——而这个旧inode,早被某个上游CDN的探测bot用HTTP/1.0连了三千次,带着Host头乱填的域名,触发了nginx的access_log按$host分目录,生成四百多个空目录,每个目录底下藏着个0字节的access.log.1.gz——占的是元数据,不是块。没人删,因为ls -lh看不出来,du -sh 也跳过空目录。上周五测试环境跑了一次模拟CC,把这事儿试出来了;生产环境?我们还在看df输出,以为是数据没清理。


  第二个盲区:证书链里的OCSP响应缓存落进/tmp。Let’s Encrypt更新后,certbot会默认往/tmp/certbot-xxx下塞一堆base64编码的OCSP响应包——每份5MB,有效期七天,每天重刷一次。没人清,因为systemd-tmpfiles清理规则只认72小时以上的tmp,这些是48小时。而且它们全带随机后缀,find /tmp -name "certbot" -mmin +60 -delete?脚本里写的却是-mmin +1440。我手敲过三次这个命令,前两次输错了分钟数,第三次输对了,但路径写成/tmp/certbot/少了个星号,结果删了自己刚下载的内核补丁压缩包。窗外雨下得特别闷,雨滴撞玻璃的声音,像硬盘坏道在寻道。


  第三个盲区最绝:MySQL的binlog_cache_size调到2G,结果master写入高峰期,每个事务都在内存里攒着binlog片段,等commit才刷盘;可有个应用层定时任务每小时跑一次“DELETE FROM log_table WHERE created_at < '2023-01-01'”,没加LIMIT,也没加FOR UPDATE——导致binlog_cache瞬间吃满,MySQL自动降级成statement模式,把整条DELETE语句记进binlog。从库apply的时候,因为时间戳不对,反复重试,binlog文件暴增。这不是慢SQL,是快SQL害死人。那天我查processlist看到State=“Writing to net”挂了四十来分钟,查变量show variables like '%binlog%';,看到max_binlog_cache_size是4G,以为够了。够个屁。cache_size是单事务上限,max_才是总池子——可池子满了它不报错,它静默切statement,然后等你某天发现从库磁盘多了32G的binlog.000091。


  李工那天凌晨四点抱着他闺女冲进机房,孩子发烧38.7度,他一边哄一边帮我翻/var/log/mysql/error.log,翻到一行:“[Warning] Storing binlog cache in memory exhausted, switching to disk-based cache”——前面还带个时间戳,二零二三年一月三日凌晨一点十九分十八秒。就这行字,我敢拍胸脯说它准。后面为什么切换失败?这个我到现在也没想明白。


  上个月搬家,我打包硬盘的时候翻出一块三年前的SSD,插上去居然能识别。cat /proc/mdstat发现它当年是做RAID1的一半,主盘故障后自动降级,备盘一直跑着read-only模式,上面堆了整整两年没删的coredump和debuginfo——占了142GB。我就纳闷,当年明明执行过mdadm --stop /dev/md0,怎么还能挂着?后来发现是udev规则里漏了rule文件,热拔插事件根本没触发卸载。你说荒诞不荒诞:我们天天在代码里写if err != nil,结果infra层连“拔盘”这个if都没写。


  所以什么叫优胜劣汰?不是谁跑得快,是谁能先把垃圾认出来。删日志要盯inode,清证书要看tmpfiles.d里那行-mmin +60到底指什么,查binlog不能光盯file size,得盯show global status like 'Binlog_cache%';。我昨天翻同事王磊的备份脚本,发现他写的是mysqldump --single-transaction --routines --triggers --events ——但漏了--hex-blob。导出来的blob字段全变成乱码,恢复失败后他还以为是字符集问题。这不是水平问题,是眼睛被惯性糊住了。


  赵总监昨天问我:“扩容为啥不管用?”我没说话。他办公室门开着,我看见他桌上放着一张打印纸,A4纸,上面手写三行字:“1. 告警阈值 85%→92%;2. 监控加disk.inode_usage;3. 下周开评审。”我就想起去年冬至,食堂阿姨多给打了半勺豆腐,我说谢谢,她抬头笑:“你天天在这儿修电脑,我认得你。”——有些事就是不该靠开会修。


  明天先把告警阈值调了,但不是调高,是拆开:用du -shx /var/log | awk '{print $1}' | sed 's/G//'换成浮点运算,再比对inodes可用率。监控屏右下角那块胶布,撕掉重贴之前,得先看看它底下是不是真有红灯。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!