自分用GNU socialのタイムラインの反映がとても遅くなって困る

自宅のPCでGNU social(nightly)を動かしているのですが,ふと気づくとタイムラインの最新が30分ほど前になっています.自分の投稿も他のMastodonインスタンスなどに反映されていません.
ログ(config.phpの$config['site']['logfile']で設定してあるもの)を見ると怪しそうなのはこの辺.

2018-02-18 22:46:31 LOG_ERR: [gnusocial.matoken.org:8923.6a16ed84 GET /api/statuses/public_and_external_timeline.json?since_id=312334&count=20] OpportunisticQueueManager: [mirror:Notice 221617] Exception (ServerException) thrown: '[SubMirror] DB_DataObject error []: DB Error: no such table'

DB Error: no such table?最近アップデートもプラグインの追加などもした覚えがないので関係あるかわかりません.連合からの投稿も次々届いているし,遅いながらもタイムラインは更新されているので捌ききれていない?とQueueDaemonを増やしてみました.

daemonを一旦停止して,

$ sudo -u www-data scripts/stopdaemons.sh 

config.phpに以下を追加,

$config['queue']['threads'] = 8;

再度daemonを実行

$ sudo -u www-data scripts/startdaemons.sh 

前(cpu coreから2threadsだった)から変わった感じがしません.vmstatを見ても特に負荷も上がっていないようです.

log levelを上げてみようとconfig.phpに以下を設定してみましたが上のエラーと同じものしか見当たりません.

$config['site']['logdebug'] = true;

mysqlcheck --auto-repairを試しにかけてみましたが変わらず.

そういえばpluginを追加したとき等にカスタムテーブルのチェックをしてくれるscript(checkschema.php)があったなと試してみました.

$ sudo -u www-data scripts/stopdaemons.sh 
$ sudo -u www-data php scripts/checkschema.php
Constraint checking Notice table...
* notice_reply_to_fkey (reply_to => notice.id)
        Found 2 notices with reply_to NOT IN notice.id, reseting...DONE.
* notice_repeat_of_fkey (repeat_of => notice.id)
* notice_profile_id_fkey (profile_id => profile.id)
PHP Warning:  fopen(/var/log/gnusocial.log): failed to open stream: ???????? in /export/data/www/gnusocial.matoken.org/lib/util.php on line 1853
PHP Warning:  fopen(/var/log/gnusocial.log): failed to open stream: ???????? in /export/data/www/gnusocial.matoken.org/lib/util.php on line 1853
  :
PHP Warning:  fopen(/var/log/gnusocial.log): failed to open stream: ???????? in /export/data/www/gnusocial.matoken.org/lib/util.php on line 1853
PHP Warning:  fopen(/var/log/gnusocial.log): failed to open stream: ???????? in /export/data/www/gnusocial.matoken.org/lib/util.php on line 1853
Ensuring no NULL values for foreign keys in QvitterNotification...DONE.
Ensuring no dead profile or notice IDs are stored in QvitterNotification...DONE.
$ sudo -u www-data scripts/startdaemons.sh 

これが当たりだったようでDB errorは消えてタイムラインの流速も戻りました.
原因は不明のままなのがちょっと気持ち悪いですが,バックアップから原因を探すのも面倒なので多分放置です…….

GNU socialをnightlyにしてみる

GNU socialは以前はloadaverage.orgにアカウントを持っていたのですが,現在は自分用に自宅PCで動かしています.同じOStatusのMastodonは開発が活発ですが,GNU socialはそれに比べると大分静かです.新しい機能も試してみたいしnightlyに上げてみました.

実際試してみるといつものUPGRADEと同じ手順でトラブルもなくnightlyにできました.

動いている GNU social をバックアップする

導入ディレクトリ以下(ここでは /var/www/gnusocial.matoken.org )とdbをバックアップしておく.
デイリーでバックアップしているので今回はそれを手動で回してtar ballにしておいた.

$ sudo -u www-data rsync -avv /var/www/gnusocial.matoken.org 
ionice -c2 -n7 nice -n19 rsync --stats -av --delete --link-dest=/export/backup/micro/gs/www/`/bin/date -d '1 day ago' +%Y%m%d`/ /var/www/gnusocial.matoken.org /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`/
$ sudo -u www-data tar cvf - /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`/ > /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`-master2nightly.tar.xz
$ umask 0266 && /usr/bin/mysqldump --defaults-file=/export/backup/micro/gs/db/.my-backup.cnf --opt --all-databases --events | /usr/bin/xz -9 > /export/backup/micro/gs/db/`date +\%Y-\%M-\%d_\%H:\%m:\%S_\%s_$$`-master2nightly.sql.xz

nightlyを導入する

前もってgit loneしてあったところに移動.cloneしてなかったらする.

$ git clone https://git.gnu.io/gnu/gnu-social.git
$ cd gnu-social

git pullしてnightlyをcheckoutする.

$ git pull
$ git checkout nightly

nightlyをcpする.sudo -u www-data は httpd がそのユーザーで動いていてファイルもその権限になっているので合わせている.

$ sudo -u www-data rsync -av --exclude={.git,.gitignore,.htaccess,config.php,file,avatar} ./ /var/www/gnusocial.matoken.org/

upgrade

ここでは GNU social の scripts/startdaemons.sh をmonit で監視しているので一時的に停止しておく.monitやそれに類するものを動かしてなければ無視して次へ.

$ sudo service monit stop

UPGRADE ファイルに書かれているとおり,デーモンを停止して,アップグレードスクリプトの実行を行い,デーモンを再開する.

$ cd /var/www/gnusocial.matoken.org/
$ sudo -u www-data bash scripts/stopdaemons.sh
$ sudo -u www-data php scripts/upgrade.php
$ sudo -u www-data bash scripts/startdaemons.sh

これで動作確認がとれたらOK
monitも再開しておく.

$ sudo service monit start

GNU socialのフッターのバーションはこうなった.

It runs on GNU social, version 1.2.0-beta5