[Android] CPUコア数が取得できないことに対する代替案
Summary
Android 7.0以降、セキュリティが強化されていて、Nodeのosモジュールにあるcpus()が読み取る /proc/stat へのアクセスが原則禁止されている。
Misskeyでは起動させるワーカーの数をCPUコア数で決めているが、コア数の取得にosモジュールを使用しており、Android 7.0以降では起動させるワーカーの数が0となってしまう。
環境変数MK_DISABLE_CLUSTERINGをセットすればこの問題は回避できるが、CPUの性能を活かしきれないし、できれば特別な設定をしなくてもyarn start一発で起動できるのが望ましい。
そのため、別な方法でCPUコア数を取得する必要がある。
/proc/cpuinfo
こちらはAndroid 7.0以降も読み取れるのでコア数を取得するのに使うことができる。
function getCPUCores(): int {
const cpuinfo = fs.readFileSync('/proc/cpuinfo').toString().split('\n');
return cpuinfo.filter(x => x.indexOf('processor\t:')==0).length;
}
if (os.platform() == 'android') {
workers = getCPUCores();
}
systeminformation
(await systeminformation.cpu()).physicalCores を使う。
Misskey側からはOSのシステムファイルに直接アクセスしないし、ライブラリに任せるので安定した結果を得られる。
ただしAndroidでは、コアが複数クラスタに分かれている場合、あるクラスタに属するコアの数しか返ってこないときがある。
例: 高効率・高性能コアがそれぞれ4つ、合計8つあるSoCでは、physicalCoresが4になる。
import si from 'systeminformation';
if (os.platform() == 'android') {
workers = (await si.cpu()).physicalCores;
}
一部環境用のワークアラウンドが散らかるのは避けたいので clusterLimit → clusterMin / clusterMax あたりにすれば良いのでは?
(というか clusterLimit を指定したい状況ってクラスタを指定数に「したい」のであって「制限したい」訳ではなさそうな気がする)
クラスタリング自体廃止しても良さそう