我有一个老化的邮件服务器……它只运行 courier postfix 和 smtp。它是一个 KVM VM,有两个驱动器,一个用于操作系统,一个用于数据。我有一个非常满的数据驱动器(报告 100% 已满,即使已使用和可用空间分布在 24GB 左右)。我不确定为什么或是什么占用了空间然后又释放了它。top 显示主要是 postfix 的 imapd 在执行操作。我无法在这台机器上获取 iotop。所以我想开始释放服务器上用户邮箱中的空间,我会执行 du -h -d1 来尝试找出最大的罪魁祸首是谁。好吧,这个命令运行得比以往任何时候都慢。所以由于它运行缓慢,我想我会发出一个屏幕命令:
du -h -d1 > 邮箱大小.txt
所以我可以在早上查看它并查看使用情况。它写了大约 6 个邮箱,最大的一个是 2.2GB,然后什么都没有。所以来到实际的机器上看看命令在它仍在运行时做了什么,看到了这个:
[root@xmail]# du -h -d1 > /root/mailboxsizes.txt
[14280.306953] INFO: task imapd:12559 blocked for more than 120 seconds.
[14280.307710] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[14280.309680] imapd D ffff8800d3d9cd98 0 12559 1 0x00000080
[14280.310591] ffff8800b17bbc20 0000000000000086 ffff880057bbce70 ffff8800b17bbfd8
[14280.310591] ffff8800b17bbfd8 ffff8800b17bbfd8 ffff880057bbce70 ffff8800d3d9cd90
[14280.313532] ffff8800d3d9cd94 ffff880057bbce70 00000000ffffffff ffff8800d3d9cd98
[14280.313532] Call Trace:
[14280.315669] [<ffffffff8168d159>] schedule_preempt_disabled+0x29/0x70
[14280.316637] [<ffffffff8168adb5>] __mutex_lock_slowpath+0xc5/0x1c0
[14280.316637] [<ffffffff81208e17>] ? unlazy_walk+0x87/0x140
[14280.318543] [<ffffffff8168a21f>] mutex_lock+0x1f/0x2f
[14280.319516] [<ffffffff81683c93>] lookup_slow+0x33/0xa7
[14280.320690] [<ffffffff8120c8f3>] path_lookupat+0x773/0x7a0
[14280.321718] [<ffffffff81183775>] ? filemap_fault+0x215/0x410
[14280.321718] [<ffffffff811de5e5>] ? kmem_cache_alloc+0x35/0x1e0
[14280.323363] [<ffffffff8120f23f>] ? getname_flags+0x4f/0x1a0
[14280.324348] [<ffffffff8120c94b>] filename_lookup+0x2b/0xc0
[14280.324348] [<ffffffff81210367>] user_path_at_empty+0x67/0xc0
[14280.325307] [<ffffffff811b1431>] ? handle_mm_fault+0x6b1/0xfe0
[14280.327150] [<ffffffff812103d1>] user_path_at+0x11/0x20
[14280.327965] [<ffffffff81203843>] vfs_fstatat+0x63/0xc0
[14280.328093] [<ffffffff81203dae>] SYSC_newstat+0x2e/0x60
[14280.328093] [<ffffffff81692875>] ? do_page_fault+0x35/0x90
[14280.330895] [<ffffffff8168ea88>] ? page_fault+0x28/0x30
[14280.331790] [<ffffffff8120408e>] SyS_newstat+0xe/0x10
[14280.331857] [<ffffffff81697089>] system_call_fastpath+0x16/0x1b
我是系统管理新手,除了与 imapd 有关的东西之外,我对这些都一无所知。我已经多次重启这台机器,但它几乎没有释放任何硬盘空间或资源。我不明白发生了什么,为什么 du 会像上面那样失败。我在这里主要想问从哪里开始?虽然这台机器很旧,而且总是有它的问题,但它以前从来没有出现过这种情况(尽管我承认数据驱动器空间不足),但如果我清除它,就会有东西把它吃掉。
为了完整性:
df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.9G 0 2.9G 0% /dev
tmpfs 2.9G 0 2.9G 0% /dev/shm
tmpfs 2.9G 41M 2.8G 2% /run
tmpfs 2.9G 0 2.9G 0% /sys/fs/cgroup
/dev/vda3 21G 18G 2.1G 90% /
/dev/vdb 459G 435G 442M 100% /mail
/dev/vda1 976M 119M 790M 14% /boot
tmpfs 581M 0 581M 0% /run/user/0
tmpfs 581M 0 581M 0% /run/user/1000
top - 06:06:53 up 6:52, 3 users, load average: 36.42, 36.64, 31.74
Tasks: 346 total, 8 running, 338 sleeping, 0 stopped, 0 zombie
%Cpu(s): 7.4 us, 1.2 sy, 0.0 ni, 0.0 id, 89.9 wa, 0.0 hi, 0.0 si, 1.5 st
KiB Mem : 5946284 total, 130280 free, 2278016 used, 3537988 buff/cache
KiB Swap: 2516988 total, 1906332 free, 610656 used. 3362528 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19174 postfix 20 0 27028 5504 1488 R 8.3 0.1 0:38.53 imapd
19586 postfix 20 0 27028 5504 1488 D 7.6 0.1 0:32.18 imapd
19008 postfix 20 0 27028 5504 1488 R 7.0 0.1 0:48.61 imapd
19372 postfix 20 0 27464 5872 1504 D 4.3 0.1 0:30.38 imapd
20087 postfix 20 0 27028 5504 1488 D 4.3 0.1 0:23.27 imapd
20188 postfix 20 0 27028 5504 1488 D 4.3 0.1 0:23.31 imapd
20353 postfix 20 0 27028 5508 1488 D 4.3 0.1 0:23.05 imapd
19963 postfix 20 0 27028 5508 1488 D 4.0 0.1 0:23.85 imapd
20275 postfix 20 0 27028 5508 1488 D 4.0 0.1 0:22.56 imapd
18460 postfix 20 0 29348 5748 1588 R 3.7 0.1 0:38.09 imapd
20236 postfix 20 0 27028 5516 1488 D 3.7 0.1 0:22.86 imapd
32 root 20 0 0 0 0 S 1.7 0.0 5:57.44 kswapd0
20079 postfix 20 0 32728 9152 1520 S 1.7 0.2 0:01.90 imapd
19702 postfix 20 0 27028 5516 1488 D 1.3 0.1 0:27.77 imapd
18575 postfix 20 0 30472 6848 1596 D 1.0 0.1 0:14.86 imapd
19782 postfix 20 0 27028 5508 1488 D 1.0 0.1 0:27.02 imapd
1026 root 20 0 1174028 22616 8992 S 0.7 0.4 2:53.90 fail2ban-s+
不确定要看什么,然后尝试下一步找出我可以在哪里找到一些文件夹,并知道我们保留了谁的旧收件箱以清除它们,以便释放空间并希望使服务器性能更好。
我唯一的想法是,让 systemctl 暂时停止 postfix,看看 du 和 ls 是否工作得更好,并仔细检查 top 是否没有因此而被 ping 出去。
如果与 iostat 相关,则:
iostat
Linux 3.10.0-514.16.1.el7.x86_64 (xmail) 11/21/2024 _x86_64_ (3 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
5.95 0.01 1.29 88.86 0.65 3.24
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 11.92 252.15 61.60 6335865 1547820
vdb 1517.62 62131.62 78.76 1561227117 1979120
屏幕上显示的消息是内核警告。此类警告通常会广播到控制台、记录在内核环形缓冲区中(通常使用带有
dmesg
可选开关的命令显示-T
)和/或复制到日志文件中/var/log
。通常,您在该控制台中运行的命令并不是导致显示错误的原因。
但在这种情况下可能存在相关性。
大多数开源 IMAP 实现都以
Maildir/
每封电子邮件作为单独文件的格式存储消息。在具有 450 GB 邮件的文件系统中,将有很多目录,其中许多目录包含大量电子邮件,因此也有很多文件。在该 /mail 文件系统上运行可能 (极其) 低效,具体取决于它使用的文件系统。例如,您可以使用和/或du
检查正在使用的文件系统。某些文件系统的性能优于其他文件系统,但单个目录 (在单个收件箱或其他邮件文件夹中) 中的数万个文件可能已经存在问题。cat /proc/mounts
/etc/fstab
类似地,当 imapd 需要索引这样的收件箱或其他邮件文件夹时,也会很费力。
文件系统已满(如命令所示
df
)会使问题更加严重。您的用户可能仍在接收消息、阅读消息和删除消息,因此负载可能相当大。df -i
如果您的 inode 也用完了,那么可能还需要运行。一般来说,(几乎)满的文件系统都会遭受各种性能问题。
对于虚拟机来说,通常可以简单地从虚拟机管理程序向虚拟磁盘分配更多存储空间,然后扩展
/mail
文件系统,许多问题就会消失。这两项操作通常都是可以在工作时间内安全执行的在线操作。相反的是找到浪费的存储空间,并通过删除不再需要的数据来回收它。
关于释放空间:
删除不再存在的用户帐户的 Maildir 和数据。
IMAP 协议要求客户端将单个邮件标记为已删除,但这实际上并未从 Maildir 中删除文件。这需要单独的 EXPUNGE 命令。一些损坏/遗留的客户端不会发出该删除命令,已删除的邮件将无限期地保留在您的邮件服务器上。
其他邮件客户端会将邮件移至“垃圾箱”或类似名称的文件夹来“删除”邮件,这些邮件也会无限期地保留在那里。清空垃圾箱可以安全地释放必要的空间。
根据您使用的邮件服务器,可能会有特定的工具来帮助您进行清理,例如
doveadm-expunge
可以搜索带有 DELETED 标志的电子邮件并将其从文件系统中正确删除的工具。