Skip to content

Commit e77e37f

Browse files
nikolaglumacdanielmainthedanhellerMarcin Mazurek
authored
[DDW-862] Enable dynamic RTS flags setting (#2758)
Co-authored-by: Daniel Main <[email protected]> Co-authored-by: Danilo Prates <[email protected]> Co-authored-by: Marcin Mazurek <[email protected]>
1 parent a1bfcdd commit e77e37f

File tree

15 files changed

+168
-22
lines changed

15 files changed

+168
-22
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
### Features
66

7+
- Added dynamic RTS flags setting ([PR 2758](https://github.com/input-output-hk/daedalus/pull/2758/files))
78
- Updated messages about Cardano node sync on the initial screen ([PR 2827](https://github.com/input-output-hk/daedalus/pull/2827)) ([PR 2831](https://github.com/input-output-hk/daedalus/pull/2831))
89

910
### Chores

source/main/cardano/CardanoNode.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ export type CardanoNodeConfig = {
7777
cliBin: string, // Path to cardano-cli executable
7878
isStaging: boolean,
7979
metadataUrl?: string,
80+
rtsFlags: Array<string>,
8081
};
8182

8283
const CARDANO_UPDATE_EXIT_CODE = 20;

source/main/cardano/CardanoWalletLauncher.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export type WalletOptions = {
3636
cliBin: string,
3737
isStaging: boolean,
3838
metadataUrl?: string,
39+
rtsFlags: Array<string>,
3940
};
4041

4142
export async function CardanoWalletLauncher(
@@ -54,6 +55,7 @@ export async function CardanoWalletLauncher(
5455
cliBin,
5556
isStaging,
5657
metadataUrl,
58+
rtsFlags,
5759
} = walletOptions;
5860
// TODO: Update launcher config to pass number
5961
const syncToleranceSeconds = parseInt(syncTolerance.replace('s', ''), 10);
@@ -140,10 +142,16 @@ export async function CardanoWalletLauncher(
140142
});
141143

142144
// RTS flags:
143-
nodeConfig.rtsOpts = [];
144-
logger.info('Launching Cardano Node with RTS flags', {
145-
rtsFlags: nodeConfig.rtsOpts,
146-
});
145+
// 1) "-H4G -M6553M -c70" 16.0% peak RSS reduction and a sub-percentile CPU regression
146+
// 2) "-H4G -M6553M" 18.5% peak RSS reduction and a second-best CPU regression
147+
if (!!rtsFlags && rtsFlags?.length > 0) {
148+
nodeConfig.rtsOpts = rtsFlags;
149+
logger.info('Launching Cardano Node with RTS flags', {
150+
rtsFlags,
151+
});
152+
} else {
153+
logger.info('Launching Cardano Node without RTS flags');
154+
}
147155

148156
merge(launcherConfig, {
149157
nodeConfig,

source/main/cardano/setup.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,12 @@ const restartCardanoNode = async (node: CardanoNode) => {
4848
*
4949
* @param launcherConfig {LauncherConfig}
5050
* @param mainWindow
51+
* @param rtsFlags flags used to start cardano-node
5152
*/
5253
export const setupCardanoNode = (
5354
launcherConfig: LauncherConfig,
54-
mainWindow: BrowserWindow
55+
mainWindow: BrowserWindow,
56+
rtsFlags: Array<string>
5557
): CardanoNode => {
5658
const {
5759
logsPrefix,
@@ -77,6 +79,7 @@ export const setupCardanoNode = (
7779
configPath,
7880
syncTolerance,
7981
cliBin,
82+
rtsFlags,
8083
isStaging,
8184
metadataUrl,
8285
startupTimeout: NODE_STARTUP_TIMEOUT,

source/main/config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,11 @@ export const BLOCK_REPLAY_PROGRESS_CHECK_INTERVAL = 1 * 1000; // 1 seconds | uni
173173
export const FALLBACK_TOKEN_METADATA_SERVER_URL =
174174
'https://metadata.cardano-testnet.iohkdev.io';
175175

176+
export const MINIMUM_AMOUNT_OF_RAM_FOR_RTS_FLAGS = 16 * 1024 * 1024 * 1024; // 16gb RAM
177+
176178
// Used by mock-token-metadata-server
177179
export const MOCK_TOKEN_METADATA_SERVER_URL = 'http://localhost';
178180
export const MOCK_TOKEN_METADATA_SERVER_PORT =
179181
process.env.MOCK_TOKEN_METADATA_SERVER_PORT || 0;
182+
183+
export const RTS_FLAGS = ['-c'];

source/main/index.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,15 @@ import {
2222
launcherConfig,
2323
pubLogsFolderPath,
2424
stateDirectoryPath,
25+
RTS_FLAGS,
26+
MINIMUM_AMOUNT_OF_RAM_FOR_RTS_FLAGS,
2527
} from './config';
2628
import { setupCardanoNode } from './cardano/setup';
2729
import { CardanoNode } from './cardano/CardanoNode';
2830
import { safeExitWithCode } from './utils/safeExitWithCode';
2931
import { buildAppMenus } from './utils/buildAppMenus';
3032
import { getLocale } from './utils/getLocale';
33+
import { getRtsFlags, setRtsFlagsAndRestart } from './utils/rtsFlags';
3134
import { detectSystemLocale } from './utils/detectSystemLocale';
3235
import { ensureXDGDataIsSet } from './cardano/config';
3336
import { rebuildApplicationMenu } from './ipc/rebuild-application-menu';
@@ -117,6 +120,7 @@ const onAppReady = async () => {
117120
const cpu = os.cpus();
118121
const platformVersion = os.release();
119122
const ram = JSON.stringify(os.totalmem(), null, 2);
123+
120124
const startTime = new Date().toISOString();
121125
// first checks for Japanese locale, otherwise returns english
122126
const systemLocale = detectSystemLocale();
@@ -162,8 +166,23 @@ const onAppReady = async () => {
162166
);
163167
saveWindowBoundsOnSizeAndPositionChange(mainWindow, requestElectronStore);
164168

165-
logger.info('Setting up Cardano Node...');
166-
cardanoNode = setupCardanoNode(launcherConfig, mainWindow);
169+
const getCurrentRtsFlags = () => {
170+
const rtsFlagsFromStorage = getRtsFlags(network);
171+
if (!rtsFlagsFromStorage) {
172+
if (os.totalmem() < MINIMUM_AMOUNT_OF_RAM_FOR_RTS_FLAGS) {
173+
setRtsFlagsAndRestart(environment.network, RTS_FLAGS);
174+
return RTS_FLAGS;
175+
}
176+
return [];
177+
}
178+
return rtsFlagsFromStorage;
179+
};
180+
181+
const rtsFlags = getCurrentRtsFlags();
182+
logger.info(
183+
`Setting up Cardano Node... with flags: ${JSON.stringify(rtsFlags)}`
184+
);
185+
cardanoNode = setupCardanoNode(launcherConfig, mainWindow, rtsFlags);
167186

168187
buildAppMenus(mainWindow, cardanoNode, userLocale, {
169188
isNavigationEnabled: false,

source/main/locales/en-US.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222
"menu.edit.undo": "Undo",
2323
"menu.helpSupport": "Help",
2424
"menu.helpSupport.blankScreenFix": "Blank Screen Fix",
25+
"menu.helpSupport.usingRtsFlags": "Using RTS flags",
26+
"menu.helpSupport.rtsFlagsDialogCancel": "Cancel",
27+
"menu.helpSupport.rtsFlagsDialogConfirm": "Yes",
28+
"menu.helpSupport.enableRtsFlagsDialogMessage": "When enabled, the Cardano node will attempt to reduce its RAM usage",
29+
"menu.helpSupport.enableRtsFlagsDialogTitle": "Enable RAM management (RTS Flags)",
30+
"menu.helpSupport.disableRtsFlagsDialogMessage": "When disabled, we will restart cardano-node in default mode",
31+
"menu.helpSupport.disableRtsFlagsDialogTitle": "Disable RAM management (RTS Flags)",
2532
"menu.helpSupport.blankScreenFixDialogCancel": "Cancel",
2633
"menu.helpSupport.blankScreenFixDialogConfirm": "Yes",
2734
"menu.helpSupport.blankScreenFixDialogMessage": "Turn off 'Blank screen fix'? \n \nDisabling the blank screen fix setting will improve the performance of user interface rendering by enabling graphics acceleration, however, some users may find that Daedalus runs better with this setting enabled. If you see a blank screen instead of the Daedalus user interface after disabling this setting and restarting Daedalus, please turn this setting back on. \n \nDo you want to disable this setting and restart Daedalus?",
@@ -43,5 +50,6 @@
4350
"menu.view.toggleDeveloperTools": "Toggle Developer Tools",
4451
"menu.view.toggleFullScreen": "Toggle Full Screen",
4552
"menu.view.toggleMaximumWindowSize": "Toggle Maximum Window Size",
46-
"window.title.blankScreenFix": "['Blank screen fix' active]"
53+
"window.title.blankScreenFix": "['Blank screen fix' active]",
54+
"window.title.usingRtsFlags": "['Using RTS flags' active]"
4755
}

source/main/locales/ja-JP.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222
"menu.edit.undo": "元に戻す",
2323
"menu.helpSupport": "ヘルプ",
2424
"menu.helpSupport.blankScreenFix": "ブランク画面修正",
25+
"menu.helpSupport.usingRtsFlags": "RTSフラグの使用",
26+
"menu.helpSupport.rtsFlagsDialogCancel": "Cancel",
27+
"menu.helpSupport.rtsFlagsDialogConfirm": "Yes",
28+
"menu.helpSupport.enableRtsFlagsDialogMessage": "When enabled, the Cardano node will attempt to reduce its RAM usage",
29+
"menu.helpSupport.enableRtsFlagsDialogTitle": "Enable RAM management (RTSフラグの使用\")",
30+
"menu.helpSupport.disableRtsFlagsDialogMessage": "When disabled, we will restart cardano-node in default mode",
31+
"menu.helpSupport.disableRtsFlagsDialogTitle": "Disable RAM management (RTSフラグの使用\")",
2532
"menu.helpSupport.blankScreenFixDialogCancel": "キャンセル",
2633
"menu.helpSupport.blankScreenFixDialogConfirm": "はい",
2734
"menu.helpSupport.blankScreenFixDialogMessage": "「ブランク画面修正」を無効にしますか? \n \nブランク画面修正設定を無効にすると、グラフィックアクセラレーションが有効化されてユーザーインターフェイスのレンダリングパフォーマンスが向上しますが、この設定を有効にした方がDaedalusがスムーズに作動する場合があります。この設定を無効にしてDaedalusを再起動した際にDaedalusユーザーインターフェイスの代わりにブランク画面が表示される場合は、この設定をもう一度有効にしてください。 \n \nこの設定を無効にしてDaedalusを再起動しますか。",
@@ -43,5 +50,6 @@
4350
"menu.view.toggleDeveloperTools": "開発者ツール切替え",
4451
"menu.view.toggleFullScreen": "フルスクリーン切替え",
4552
"menu.view.toggleMaximumWindowSize": "最大ウインドウサイズ切り切り替え",
46-
"window.title.blankScreenFix": "[「ブランク画面修正」有効 ]"
53+
"window.title.blankScreenFix": "[「ブランク画面修正」有効 ]",
54+
"window.title.usingRtsFlags": "[「RTSフラグの使用」が有効]"
4755
}

source/main/menus/MenuActions.types.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// @flow
22
export type MenuActions = {
33
toggleBlankScreenFix: Function,
4+
setRtsFlags: Function,
45
openAboutDialog: Function,
56
openDaedalusDiagnosticsDialog: Function,
67
openItnRewardsRedemptionDialog: Function,

source/main/menus/osx.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@ import { environment } from '../environment';
88
import { showUiPartChannel } from '../ipc/control-ui-parts';
99
import { NOTIFICATIONS } from '../../common/ipc/constants';
1010
import { generateSupportRequestLink } from '../../common/utils/reporting';
11+
import { getRtsFlags } from '../utils/rtsFlags';
1112

1213
const id = 'menu';
13-
const { isBlankScreenFixActive } = environment;
14+
const { isBlankScreenFixActive, network } = environment;
15+
const rtsFlags = getRtsFlags(network);
16+
const rtsFlagsEnabled: boolean = !!rtsFlags?.length && rtsFlags.length > 0;
1417

1518
export const osxMenu = (
1619
app: App,
@@ -154,6 +157,15 @@ export const osxMenu = (
154157
actions.toggleBlankScreenFix(item);
155158
},
156159
},
160+
{
161+
label: translation('helpSupport.usingRtsFlags'),
162+
type: 'checkbox',
163+
checked: rtsFlagsEnabled,
164+
click(item) {
165+
actions.setRtsFlags(!rtsFlagsEnabled);
166+
item.checked = rtsFlagsEnabled;
167+
},
168+
},
157169
{ type: 'separator' },
158170
{
159171
label: translation('helpSupport.safetyTips'),
@@ -162,15 +174,6 @@ export const osxMenu = (
162174
shell.openExternal(safetyTipsLinkUrl);
163175
},
164176
},
165-
/* {
166-
label: translation('helpSupport.featureRequest'),
167-
click() {
168-
const featureRequestLinkUrl = translation(
169-
'helpSupport.featureRequestUrl'
170-
);
171-
shell.openExternal(featureRequestLinkUrl);
172-
},
173-
}, */
174177
{
175178
label: translation('helpSupport.supportRequest'),
176179
click() {

0 commit comments

Comments
 (0)