经过几个小时的测试,我发现适用于 ubuntu 20.04 的 nextcloud 桌面同步客户端(appimage 或 ppa)似乎都有一个错误,如果发生常见的 nextcloud 文件同步错误,kswapd0 会飙升至 100% 的 CPU,并且 Debian 10.5 服务器上的交换文件会完全填满。(在 kswapd0 攀升至 100% 的 CPU 期间,clamscan 也会飙升 45% 到 100%)。我的其他同步客户端不会导致此问题(移动、ubuntu 原生“在线帐户”)。
top 命令输出
top - 16:08:59 up 22 min, 2 users, load average: 89.42, 84.04, 55.66
Tasks: 378 total, 12 running, 359 sleeping, 0 stopped, 7 zombie
%Cpu(s): 3.4 us, 57.0 sy, 0.0 ni, 0.1 id, 39.5 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3946.8 total, 90.2 free, 3766.4 used, 90.1 buff/cache
MiB Swap: 6144.0 total, 0.0 free, 6144.0 used. 4.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
36 root 30 10 0 0 0 R 98.3 0.0 12:43.68 kswapd0
1691 mysql 20 0 1739540 2376 0 S 3.9 0.1 0:34.59 mysqld
1300 root 10 -10 116752 3400 0 D 3.3 0.1 0:41.96 AliYunDun
1544 root 20 0 806108 640 0 D 2.4 0.0 0:09.45 aliyun-service
161 root 20 0 4556 1904 1844 S 0.9 0.0 0:10.60 plymouthd
2746 git 20 0 1374728 6020 0 S 0.7 0.1 0:07.23 gitea
1114 root 20 0 24312 284 0 S 0.5 0.0 0:03.74 AliYunDunUpdate
5805 web2 20 0 292472 215456 920 D 0.4 5.3 0:05.43 clamscan
155 root 0 -20 0 0 0 I 0.3 0.0 0:07.11 kworker/0:1H-kbl+
232 root 20 0 70888 284 88 D 0.3 0.0 0:03.74 systemd-journal
936 memcache 20 0 408168 0 0 S 0.3 0.0 0:02.19 memcached
3492 root 20 0 11380 756 556 R 0.3 0.0 0:03.28 top
1 root 20 0 170192 2972 0 D 0.3 0.1 0:11.03 systemd
1041 redis 20 0 54244 428 0 D 0.3 0.0 0:03.28 redis-server
4029 www-data 20 0 339376 2436 16 D 0.3 0.1 0:00.85 /usr/sbin/apach
我曾尝试使用 nice 和 cpulimit 来防止 kswapd0 达到 100% 并完全消耗交换内存。但 kswapd0 似乎只是通过两个命令(无论是单独运行还是同时运行)来供电,并且消耗 100% 的 CPU 和交换,让我别无选择,只能重新启动服务器以清除交换缓存。
我已经将 swapiness 降低到零。并且我尝试过:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches
我认为 nextcloud 文件同步错误在未来会变得很常见,有人能建议我如何缓解/防止简单的文件同步错误导致整个服务器崩溃吗?
更新
经过一些额外的测试和阅读后,似乎 ClamAV 在每次上传和发送电子邮件时都会运行 clamscan,这会导致 CPU 使用率飙升至 100%。与 nextcloud 的关系是,我已激活文件防病毒程序。因此,我的文件同步上传也会启动 clamscan,然后导致服务器过载。
解决方案似乎是停止使用 clamscan,而是实施 clamav-daemon。我现在正在研究这个问题,但如果有人能告诉我如何从 clamscan 切换到 clamav-daemon。我将不胜感激。
到目前为止我已经尝试过:
service clamd start
Failed to start clamd.service: Unit clamd.service not found.
和
# freshclam -d
ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).
ERROR: initialize: libfreshclam init failed.
ERROR: Initialization error!
答案1
好的...我解决了...上面的问题有两个方面,意味着 amavis 运行的是 clamscan 而不是 clamd,同时 nextcloud antivirus 默认使用 clamscan 而不是 clamd。
解决方案:
1.) #dpkg-reconfigure clamav-daemon
<- 无论出于何种原因,此配置都不是永久性的,系统在重启后会恢复。要永久限制 Debian/Ubuntu 机器上的 clamscan 的 CPU,请将以下内容添加
CPUAccounting=true CPUQuota=X%
到:
#nano /etc/systemd/system/clamav-daemon.service.d/extend.conf
2.) 更改 nextcloud 的防病毒默认设置从clamscan到clamav 守护进程(套接字)
这将解决您的问题。现在 nextcloud 可以出现任意数量的 snyc 错误,而无需关闭整个服务器。
有用的东西,但这里是可选的。对于那些使用默认安装了 systemd/cgroups 的 debian/ubuntu 操作共享托管环境的人来说。我找到了一个关于如何限制用户 CPU 使用率的优秀教程:
https://www.webhostingtalk.com/showthread.php?t=1832382
通过此功能,您可以限制用户的整体 CPU 使用率,以避免客户端因应用程序设置不当而导致服务器崩溃。