misskey icon indicating copy to clipboard operation
misskey copied to clipboard

[Android] CPUコア数が取得できないことに対する代替案

Open CyberRex0 opened this issue 3 years ago • 3 comments

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;
}

CyberRex0 avatar Jan 03 '23 14:01 CyberRex0

一部環境用のワークアラウンドが散らかるのは避けたいので clusterLimitclusterMin / clusterMax あたりにすれば良いのでは?

acid-chicken avatar Jan 03 '23 14:01 acid-chicken

(というか clusterLimit を指定したい状況ってクラスタを指定数に「したい」のであって「制限したい」訳ではなさそうな気がする)

acid-chicken avatar Jan 03 '23 14:01 acid-chicken

クラスタリング自体廃止しても良さそう

syuilo avatar Jan 06 '23 23:01 syuilo