
笔者通过以下方法对 Nextcloud 进行了一系列的优化工作,在性能上虽说有所提升,但在 Web 工作界面进行读取、写入、删除等操作时,仍感到缓慢。
《Nextcloud性能优化-定时生成缩略图》
《Nextcloud性能优化-开启HTTP2》
《Nextcloud性能优化-后台任务Cron》
《Nextcloud性能优化-PHP-FPM进程管理优化》
Nextcloud 的文件数据记录是与数据库关联的,难道是与数据库读取、写入有关?这时,想到了MySQL磁盘写入策略以及数据安全性的关键参数 innodb_flush_log_at_trx_commit。
SSH 登录 Ubuntu Server,sudo -i 获取 root 权限,输入如下命令,查看 MariaDB 的 innodb_flush_log_at_trx_commit 参数值。
(笔者使用的是 MariaDB,MySQL与之同理。)
mysql -u root -p
#输入数据库用户root密码
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
#查看innodb_flush_log_at_trx_commit的值

默认值为 1 。
对于 innodb_flush_log_at_trx_commit 的参数,MySQL官网解释如下:

简单理解就是:
innodb_flush_log_at_trx_commit = 0 每秒调用 flush + fsync,定时器自己维护。
innodb_flush_log_at_trx_commit = 1 实时调用 flush + fsync 没法批处理,性能很低。
innodb_flush_log_at_trx_commit = 2 实时flush,定时 fsync 交给 OS 维护定时器。
参数为 1 时,安全性最高,在读写过程中断电或故障不会造成数据的严重丢失,但是性能非常低。
参数为 0 时,安全性最低,在读写过程中断电或故障可能会造成数据的严重丢失,但是性能非常高。
参数为 2 时,安全性及性能都为中,在读写过程中断电或故障可能会造成数据的丢失。
最后,折中选择设置参数为 2 。
(注:在文件上传写入时断电或故障,仍可使用 Nextcloud 命令 ”sudo -u www-data php occ files:scan 用户名“,对用户上传文件重新扫描并关联入数据库。)
具体修改方法如下:
进入 /etc/mysql/mariadb.conf.d 目录,修改 50-server.cnf 文件。
nano 50-server.cnf
在 [mysqld] 项下添加 innodb_flush_log_at_trx_commit = 2

保存并退出,重启数据库服务。
service mysql restart
再次输入如下命令查看 innodb_flush_log_at_trx_commit 参数值。
mysql -u root -p
#输入数据库用户root密码
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
#查看innodb_flush_log_at_trx_commit的值
显示参数值为 2 。

至此,设置已成功,测试读写性能,得到了明显的提高。
另外,可以再结合设置 sync_binlog 参数,实现进一步的优化,具体参数值及解释请上网查找。