Nextcloud 后台任务 cron 的优化
- 发现
- [原来是 systemd & 优化系统cron](#原来是 systemd & 优化系统cron)
- nextcloud-cron.service
- nextcloudcron.timer
- [优化 Nextcloud 配置](#优化 Nextcloud 配置)
- 数据库优化
- 监控和调试
- [优化 PHP 配置](#优化 PHP 配置)
Nextcloud 优化是个长期的过程,只能遇到问题解决问题了。遇到的问题和解决办法会逐步的编写完善。
伴随着内容增多,并添加更多的功能,访问 Nextcloud 变慢。通过修改PHP 内存限制,得到改善:
系统版本: Ubuntu 22.04
PHP 版本: PHP 8.2
发现
Nextcloud 有个后台执行的cron ,在管理界面中已经设置为系统运行,默认是5分钟执行一次。 后来修改了crontab 中执行的时间为每天2点执行。 但发现系统中Nextcloud 的cron 还是每5分钟执行一次,由于系统内容比较多,我有不断地导入音频文件,看到执行时间比较长,占用资源比较多。 cron 是抓到了,但是是从哪来启动它的呢?
bash
top - 10:58:28 up 6 days, 23:14, 2 users, load average: 1.29, 1.83, 2.12
Tasks: 218 total, 3 running, 215 sleeping, 0 stopped, 0 zombie
%Cpu(s): 26.5 us, 2.5 sy, 0.0 ni, 69.7 id, 0.0 wa, 0.0 hi, 1.3 si, 0.0 st
MiB Mem : 15911.4 total, 680.4 free, 9976.8 used, 5254.3 buff/cache
MiB Swap: 4096.0 total, 2988.2 free, 1107.8 used. 5645.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
325905 www 20 0 7993928 7.1g 38124 R 100.0 45.8 8:46.31 php
234112 453 20 0 2320 848 616 S 15.6 0.0 185:31.75 dnsmasq
196668 root 20 0 7803532 982136 3692 S 0.7 6.0 23:01.41 java
971 root 20 0 547840 19524 8560 S 0.3 0.1 12:30.56 fail2ban-server
8385 root 39 19 35668 9744 572 S 0.3 0.1 44:12.32 netdata
326292 root 20 0 11040 4352 3596 R 0.3 0.0 0:00.02 top
1 root 20 0 168176 11644 6520 S 0.0 0.1 2:06.88 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.25 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 slub_flushwq
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-events_highpri
10 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_rude_
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_trace
13 root 20 0 0 0 0 S 0.0 0.0 0:12.82 ksoftirqd/0
原来是 systemd & 优化系统cron
nextcloud-cron.service
bash
2222@2222:/etc/systemd/system# more nextcloud-cron.service
[Unit]
Description=Nextcloud cron.php job
[Service]
User=www
ExecStart=/usr/bin/php -f /www/nextcloud/cron.php
[Install]
WantedBy=basic.target
修改为:
bash
[Unit]
Description=Nextcloud cron.php job
[Service]
User=www-data
ExecCondition=php -f /var/www/nextcloud/occ status -e
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
KillMode=process
[Install]
WantedBy=basic.target
nextcloudcron.timer
bash
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
修改为
bash
222@222:/etc/systemd/system# more nextcloudcron.timer
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
# 每天中午12:00执行
OnCalendar=*-*-* 12:00:00
# 每天晚上20:00-23:59每小时执行(注意:不能直接用20..23语法)
OnCalendar=*-*-* 20:00:00
OnCalendar=*-*-* 21:00:00
OnCalendar=*-*-* 22:00:00
OnCalendar=*-*-* 23:00:00
AccuracySec=1h
# 关联的服务
Unit=nextcloud-cron.service
# 如果错过时间,尽快补执行
Persistent=true
[Install]
WantedBy=timers.target
优化 Nextcloud 配置
编辑 config/config.php:
php
'cronMaxJobs' => 10, // 减少同时运行的作业数
'cronMaxExecutionTime' => 3600, // 设置最大执行时间
'filelocking.enabled' => true, // 确保文件锁定启用
数据库优化
bash
sudo -u www php /www/nextcloud/occ db:add-missing-indices
sudo -u www php /www/nextcloud/occ db:convert-filecache-bigint
监控和调试
bash
sudo -u www php /www/nextcloud/occ background:cron
优化 PHP 配置
php
; 减少内存限制
memory_limit = 128M
; 优化 OPcache
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1