static void get_pid_metrics(apr_int32_t pid, apr_int32_t tmid, apr_int32_t ssid, apr_int32_t ccnt) { apr_int32_t status; sigar_proc_cpu_t cpu; sigar_proc_mem_t mem; sigar_proc_fd_t fd; pidrec_t* rec; apr_pool_t* pool = apr_hash_pool_get(gx.pidtab); rec = apr_hash_get(gx.pidtab, &pid, sizeof(pid)); if (rec && rec->updated_tick == gx.tick) return; /* updated in current cycle */ memset(&cpu, 0, sizeof(cpu)); memset(&mem, 0, sizeof(mem)); memset(&fd, 0, sizeof(fd)); TR2(("--------------------- starting %d\n", pid)); if (!rec) { sigar_proc_exe_t exe; /* There might be cases where the pid no longer exist, so we'll just * zero out the memory first before doing anything */ rec = apr_pcalloc(pool, sizeof(*rec)); CHECKMEM(rec); rec->pid = pid; rec->query_key.tmid = tmid; rec->query_key.ssid = ssid; rec->query_key.ccnt = ccnt; rec->pname = rec->cwd = 0; if (0 == sigar_proc_exe_get(gx.sigar, pid, &exe)) { rec->pname = apr_pstrdup(pool, exe.name); rec->cwd = apr_pstrdup(pool, exe.root); } if (!rec->pname) rec->pname = "unknown"; if (!rec->cwd) rec->cwd = "unknown"; apr_hash_set(gx.pidtab, &rec->pid, sizeof(rec->pid), rec); } status = sigar_proc_mem_get(gx.sigar, pid, &mem); /* ESRCH is error 3: (No such process) */ if (status != SIGAR_OK) { if (status != ESRCH) { TR2(("[WARNING] %s. PID: %d\n", sigar_strerror(gx.sigar, status), pid)); } return; } status = sigar_proc_cpu_get(gx.sigar, pid, &cpu); if (status != SIGAR_OK) { if (status != ESRCH) { TR2(("[WARNING] %s. PID: %d\n", sigar_strerror(gx.sigar, status), pid)); } return; } status = sigar_proc_fd_get(gx.sigar, pid, &fd); if (status != SIGAR_OK) { if (status != ESRCH) { TR2(("[WARNING] %s. PID: %d\n", sigar_strerror(gx.sigar, status), pid)); } return; } rec->updated_tick = gx.tick; rec->p_metrics.fd_cnt = (apr_uint32_t) fd.total; rec->p_metrics.cpu_pct = (float) (cpu.percent * cpu_cores_utilization_multiplier); rec->p_metrics.mem.size = mem.size; rec->p_metrics.mem.resident = mem.resident; #ifdef __linux__ rec->p_metrics.mem.share = mem.share; #else rec->p_metrics.mem.share = 0; #endif rec->cpu_elapsed = cpu.total; }
//------------------------------------------------------------------------------------- float SystemInfo::getCPUPerByPID(uint32 pid) { if(pid == 0) { pid = (uint32)getProcessPID(); } float percent = 0.f; bool tryed = false; _TRYGET: if(!hasPID(pid, &_g_proclist)) { DEBUG_MSG(fmt::format("SystemInfo::getCPUPerByPID: error: not found pid({})\n", pid)); if(!tryed) { clear(); tryed = true; if(_autocreate()) goto _TRYGET; } return 0.f; } /* int status = SIGAR_OK; // for (size_t i = 0; i < proclist.number; i++) { sigar_proc_cpu_t cpu; status = sigar_proc_cpu_get(_g_sigarproclist, pid, &cpu); if (status != SIGAR_OK) { DEBUG_MSG(fmt::format("error: {} ({}) proc_cpu_get({})\n", status, sigar_strerror(_g_sigarproclist, status), pid)); return 0.f; } } */ // sleep(1000); // for (size_t i = 0; i < proclist.number; i++) { sigar_proc_cpu_t cpu; int status = sigar_proc_cpu_get(_g_sigarproclist, pid, &cpu); if (status == SIGAR_OK) { /* sigar_proc_state_t procstate; status = sigar_proc_state_get(sigarproclist, pid, &procstate); if (status != SIGAR_OK) { DEBUG_MSG(fmt::format("error: {} ({}) proc_state({})\n", status, sigar_strerror(sigarproclist, status), pid)); return 0.f; } */ percent = float(cpu.percent) * 100.f; #if KBE_PLATFORM == PLATFORM_WIN32 percent /= float(countCPU()); #endif } else { DEBUG_MSG(fmt::format("error: {} ({}) proc_cpu_get({})\n", status, sigar_strerror(_g_sigarproclist, status), pid)); return 0.f; } } return percent; }