Skip to content

Commit

Permalink
darwin: Enhance memory metrics support for Apple Silicon (ARM64)
Browse files Browse the repository at this point in the history
  • Loading branch information
SuCicada committed Apr 8, 2024
1 parent 599233f commit b3d2dcc
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 0 deletions.
16 changes: 16 additions & 0 deletions darwin/DarwinMachine.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,16 @@ static void DarwinMachine_getVMStats(vm_statistics_t p) {
}
}

#if defined(__arm64__)
static void DarwinMachine_getVMStats64(vm_statistics64_t p) {
mach_msg_type_number_t info_size = HOST_VM_INFO64_COUNT;

if (host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info_t) p, &info_size) != 0) {
CRT_fatalError("Unable to retrieve VM statistics64");
}
}
#endif

void Machine_scan(Machine* super) {
DarwinMachine* host = (DarwinMachine*) super;

Expand All @@ -75,6 +85,9 @@ void Machine_scan(Machine* super) {
host->prev_load = host->curr_load;
DarwinMachine_allocateCPULoadInfo(&host->curr_load);
DarwinMachine_getVMStats(&host->vm_stats);
#if defined(__arm64__)
DarwinMachine_getVMStats64(&host->vm_stats64);
#endif
openzfs_sysctl_updateArcStats(&host->zfs);
}

Expand All @@ -92,6 +105,9 @@ Machine* Machine_new(UsersTable* usersTable, uid_t userId) {

/* Initialize the VM statistics */
DarwinMachine_getVMStats(&this->vm_stats);
#if defined(__arm64__)
DarwinMachine_getVMStats64(&this->vm_stats64);
#endif

/* Initialize the ZFS kstats, if zfs.kext loaded */
openzfs_sysctl_init(&this->zfs);
Expand Down
3 changes: 3 additions & 0 deletions darwin/DarwinMachine.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ typedef struct DarwinMachine_ {

host_basic_info_data_t host_info;
vm_statistics_data_t vm_stats;
#if defined(__arm64__)
vm_statistics64_data_t vm_stats64;
#endif
processor_cpu_load_info_t prev_load;
processor_cpu_load_info_t curr_load;

Expand Down
19 changes: 19 additions & 0 deletions darwin/Platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,24 @@ double Platform_setCPUValues(Meter* mtr, unsigned int cpu) {
return CLAMP(total, 0.0, 100.0);
}

#if defined(__arm64__)
void Platform_setMemoryValues(Meter *mtr) {
const DarwinMachine *dhost = (const DarwinMachine *) mtr->host;
const struct vm_statistics64 *vm = &dhost->vm_stats64;
double page_K = (double) vm_page_size / (double) 1024;

mtr->total = dhost->host_info.max_mem / 1024;
int used = vm->active_count + vm->inactive_count +
vm->speculative_count + vm->wire_count +
vm->compressor_page_count - vm->purgeable_count - vm->external_page_count;
mtr->values[MEMORY_METER_USED] = (double) (used - vm->compressor_page_count) * page_K;
// mtr->values[MEMORY_METER_SHARED] = "shared memory, like tmpfs and shm"
mtr->values[MEMORY_METER_COMPRESSED] = (double) vm->compressor_page_count * page_K;
mtr->values[MEMORY_METER_BUFFERS] = (double) vm->purgeable_count * page_K;
mtr->values[MEMORY_METER_CACHE] = (double) vm->inactive_count * page_K;
// mtr->values[MEMORY_METER_AVAILABLE] = "available memory"
}
#else
void Platform_setMemoryValues(Meter* mtr) {
const DarwinMachine* dhost = (const DarwinMachine*) mtr->host;
const struct vm_statistics* vm = &dhost->vm_stats;
Expand All @@ -303,6 +321,7 @@ void Platform_setMemoryValues(Meter* mtr) {
mtr->values[MEMORY_METER_CACHE] = (double)vm->inactive_count * page_K;
// mtr->values[MEMORY_METER_AVAILABLE] = "available memory"
}
#endif

void Platform_setSwapValues(Meter* mtr) {
int mib[2] = {CTL_VM, VM_SWAPUSAGE};
Expand Down

0 comments on commit b3d2dcc

Please sign in to comment.