int main(int argc, char *argv[]) { pid_t pid; if (argc < 2) { printf("%s <PID>\n", argv[0]); return 0; } sscanf(argv[1], "%d", &pid); cpu_set_t mask; unsigned int len = sizeof(mask); if (sched_getaffinity(pid, len, &mask) < 0) { perror("sched_getaffinity"); return -1; } int i, cpu_num = get_cpu_num(); if (cpu_num < 0) { printf("can't get cpu number\n"); return 1; } printf("PID[%d]: ", pid); for (i = 0; i < cpu_num; i++) { printf("%d", CPU_ISSET(i, &mask)); } printf("\n"); return 0; }
void MachineMonitor::run() { LOG.info("%s: start to monitor machine status.", _name.c_str()); HostInfo::HostState::type machine_state = HostInfo::HostState::AVAILABLE; // check machine resource. LOG.trace("%s: start to monitor machine resource.", _name.c_str()); ResourceTuple resource(get_cpu_num(), get_total_memory(), get_total_disk()); if (resource._cpu_num <= 0L || resource._memory_mb <= 0L || resource._disk_total_mb <= 0L) { LOG.error("%s: get machine resource error.", _name.c_str()); machine_state = HostInfo::HostState::FAILED; } LOG.info("%s: machine resource: %s", _name.c_str(), resource.to_json().toStyledString().c_str()); if (!monitor_disk()) { LOG.error("%s: monitor disk error.", _name.c_str()); machine_state = HostInfo::HostState::FAILED; } LOG.info("%s: machine status: %s", _name.c_str(), HostInfo::HostState::to_string(machine_state).c_str()); _manager.report_machine_status(machine_state); _manager.report_machine_resource(resource); if (machine_state == HostInfo::HostState::FAILED) { die(); } LOG.info("%s: finish to monitor machine.", _name.c_str()); }
/* * initialize event manager. * socketer_num --- socket total number. must greater than 1. * thread_num --- thread number, if less than 0, then start by the number of cpu threads */ bool eventmgr_init(int socketer_num, int thread_num) { if (s_mgr || socketer_num < 1) return false; if (thread_num <= 0) { thread_num = get_cpu_num(); } /* in kqueue, must only one thead. */ thread_num = 1; { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_IGN; sigemptyset(&sa.sa_mask); if (sigaction(SIGPIPE, &sa, NULL) == -1) return false; } s_mgr = (struct kqueuemgr *)malloc(sizeof(struct kqueuemgr)); if (!s_mgr) return false; /* initialize. */ catomic_set(&s_mgr->event_num, 0); s_mgr->kqueue_fd = kqueue(); if (s_mgr->kqueue_fd == -1) { free(s_mgr); s_mgr = NULL; return false; } s_mgr->thread_num = thread_num; s_mgr->need_exit = false; /* first building kqueue module, and then create thread pool. */ s_mgr->thread_pool = cthread_pool_create(thread_num, s_mgr, leader_func, task_func); if (!s_mgr->thread_pool) { close(s_mgr->kqueue_fd); free(s_mgr); s_mgr = NULL; return false; } return true; }
int SYSTEM_CPU_LOAD(AGENT_REQUEST *request, AGENT_RESULT *result) { char *tmp; int mode, per_cpu = 1, cpu_num; double load[ZBX_AVG_COUNT], value; if (2 < request->nparam) return SYSINFO_RET_FAIL; tmp = get_rparam(request, 0); if (NULL == tmp || '\0' == *tmp || 0 == strcmp(tmp, "all")) per_cpu = 0; else if (0 != strcmp(tmp, "percpu")) return SYSINFO_RET_FAIL; tmp = get_rparam(request, 1); if (NULL == tmp || '\0' == *tmp || 0 == strcmp(tmp, "avg1")) mode = ZBX_AVG1; else if (0 == strcmp(tmp, "avg5")) mode = ZBX_AVG5; else if (0 == strcmp(tmp, "avg15")) mode = ZBX_AVG15; else return SYSINFO_RET_FAIL; if (mode >= getloadavg(load, 3)) return SYSINFO_RET_FAIL; value = load[mode]; if (1 == per_cpu) { if (0 >= (cpu_num = get_cpu_num(1))) return SYSINFO_RET_FAIL; value /= cpu_num; } SET_DBL_RESULT(result, value); return SYSINFO_RET_OK; }
int SYSTEM_CPU_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { char tmp[16]; int cpu_num; if (1 < num_param(param)) return SYSINFO_RET_FAIL; /* only "online" (default) for parameter "type" is supported */ if (0 == get_param(param, 1, tmp, sizeof(tmp)) && '\0' != *tmp && 0 != strcmp(tmp, "online")) return SYSINFO_RET_FAIL; if (-1 == (cpu_num = get_cpu_num())) return SYSINFO_RET_FAIL; SET_UI64_RESULT(result, cpu_num); return SYSINFO_RET_OK; }
int main(int argc, char *argv[]) { pid_t pid; if (argc < 3) { printf("%s <PID> <CPU_AFFINITY>\ne.g. %s 9527 0110\n", argv[0], argv[0]); return 0; } sscanf(argv[1], "%d", &pid); int i, cpu_num = get_cpu_num(); if (cpu_num < 0) { printf("can't get cpu number\n"); return 1; } cpu_set_t mask; unsigned int len = sizeof(mask); CPU_ZERO(&mask); for (i = 0; i < cpu_num && argv[2][i] != '\0'; i++) { if (argv[2][i] == '1') { CPU_SET(i, &mask); } else if (argv[2][i] == '0') { CPU_CLR(i, &mask); } else { printf("bad cpu_affinity, only 0/1 is allowed\n"); return 2; } } if (sched_setaffinity(pid, len, &mask) < 0) { perror("sched_setaffinity"); return -1; } printf("PID[%d] set to [%s] ok\n", pid, argv[2]); return 0; }
int SYSTEM_CPU_NUM(AGENT_REQUEST *request, AGENT_RESULT *result) { char *tmp; if (1 < request->nparam) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); return SYSINFO_RET_FAIL; } /* only "online" (default) for parameter "type" is supported */ if (NULL != (tmp = get_rparam(request, 0)) && '\0' != *tmp && 0 != strcmp(tmp, "online")) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); return SYSINFO_RET_FAIL; } SET_UI64_RESULT(result, get_cpu_num()); return SYSINFO_RET_OK; }
int SYSTEM_CPU_NUM(AGENT_REQUEST *request, AGENT_RESULT *result) { char *tmp; int cpu_num; if (1 < request->nparam) return SYSINFO_RET_FAIL; tmp = get_rparam(request, 0); /* only "online" (default) for parameter "type" is supported */ if (NULL != tmp && '\0' != *tmp && 0 != strcmp(tmp, "online")) return SYSINFO_RET_FAIL; if (-1 == (cpu_num = get_cpu_num())) return SYSINFO_RET_FAIL; SET_UI64_RESULT(result, cpu_num); return SYSINFO_RET_OK; }
int bind_process_cpu(int cpu) { cpu_set_t cmask; size_t n; int ret; n = get_cpu_num(); if (cpu < 0 || cpu >= (int)n) { errno = EINVAL; return -1; } CPU_ZERO(&cmask); CPU_SET(cpu, &cmask); ret = sched_setaffinity(0, n, &cmask); CPU_ZERO(&cmask); return ret; }
int SYSTEM_CPU_NUM(AGENT_REQUEST *request, AGENT_RESULT *result) { char *tmp; int online = 0, ncpu; if (1 < request->nparam) return SYSINFO_RET_FAIL; tmp = get_rparam(request, 0); if (NULL == tmp || '\0' == *tmp || 0 == strcmp(tmp, "online")) online = 1; else if (0 != strcmp(tmp, "max")) return SYSINFO_RET_FAIL; if (-1 == (ncpu = get_cpu_num(online))) return SYSINFO_RET_FAIL; SET_UI64_RESULT(result, ncpu); return SYSINFO_RET_OK; }
int SYSTEM_CPU_LOAD(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { char tmp[16]; int mode, per_cpu = 1, cpu_num; double load[ZBX_AVG_COUNT], value; if (2 < num_param(param)) return SYSINFO_RET_FAIL; if (0 != get_param(param, 1, tmp, sizeof(tmp)) || '\0' == *tmp || 0 == strcmp(tmp, "all")) per_cpu = 0; else if (0 != strcmp(tmp, "percpu")) return SYSINFO_RET_FAIL; if (0 != get_param(param, 2, tmp, sizeof(tmp)) || '\0' == *tmp || 0 == strcmp(tmp, "avg1")) mode = ZBX_AVG1; else if (0 == strcmp(tmp, "avg5")) mode = ZBX_AVG5; else if (0 == strcmp(tmp, "avg15")) mode = ZBX_AVG15; else return SYSINFO_RET_FAIL; if (mode >= getloadavg(load, 3)) return SYSINFO_RET_FAIL; value = load[mode]; if (1 == per_cpu) { if (0 >= (cpu_num = get_cpu_num())) return SYSINFO_RET_FAIL; value /= cpu_num; } SET_DBL_RESULT(result, value); return SYSINFO_RET_OK; }
int main(int argc, char *argv[]) { printf("Usage: %s [-k] [-d] [-c] [start_cpu] [-w] [worker_num] [-a] [ip:port ...] [-x] [ip:port ...]\n", argv[0]); printf(" -c: specify the first cpu to bind each worker\n [default is 0]\n"); printf(" -w: specify worker number\n [default is the available cpu core number]\n"); printf(" -a: specify frontend listen address\n [default is 0.0.0.0:80]\n"); printf(" -x: enable proxy mode and specify backend listen address\n [default is off]\n"); printf(" -k: enable HTTP keepalive\n [default is off]\n"); printf(" -v: enable verbose mode\n [default is off]\n"); printf(" -d: enable debug mode\n [default is off]\n"); printf(" -o: specify log file\n [default is ./demo.log]\n"); printf("\n"); again: if (argc >= 2 && strcmp(argv[1], "-d") == 0) { enable_debug = 1; argv++; argc--; goto again; } if (argc >= 2 && strcmp(argv[1], "-v") == 0) { enable_verbose = 1; argv++; argc--; goto again; } if (argc >= 2 && strcmp(argv[1], "-k") == 0) { enable_keepalive = 1; argv++; argc--; goto again; } if (argc >= 3 && strcmp(argv[1], "-o") == 0) { strncpy(log_path, argv[2], sizeof(log_path)); specified_log_file = 1; argv += 2; argc -= 2; goto again; } if (argc >= 3 && strcmp(argv[1], "-c") == 0) { start_cpu = atoi(argv[2]); argv += 2; argc -= 2; goto again; } if (argc >= 3 && strcmp(argv[1], "-w") == 0) { process_mode = 1; num_workers = atoi(argv[2]); argv += 2; argc -= 2; goto again; } if (argc >= 3 && strcmp(argv[1], "-a") == 0) { int i ; for (i = 0; i < MAX_LISTEN_ADDRESS && argv[2]; i++) { char *sep = strchr(argv[2], ':'); if (sep) { *sep = 0; strncpy(la[i].param_ip, argv[2], 32); inet_aton(la[i].param_ip, &la[i].listenip); sscanf(++sep, "%d", &la[i].param_port); } else break; argv++; argc--; la_num++; } argv++; argc--; goto again; } if (argc >= 3 && strcmp(argv[1], "-x") == 0) { int i ; enable_proxy = 1; for (i = 0; i < MAX_PROXY_ADDRESS && argv[2]; i++) { char *sep = strchr(argv[2], ':'); if (sep) { *sep = 0; strncpy(pa[i].param_ip, argv[2], 32); inet_aton(pa[i].param_ip, &pa[i].proxyip); sscanf(++sep, "%d", &pa[i].param_port); } else break; argv++; argc--; pa_num++; } argv++; argc--; goto again; } if (!process_mode) process_mode = 1; if (!num_workers) num_workers = get_cpu_num(); assert(num_workers >= 1 && num_workers <= get_cpu_num()); if (la_num) { int i; printf("Specified listen address:\n"); for (i = 0; i < la_num; i++) { printf("\t%s:%d\n", la[i].param_ip, la[i].param_port); } } else { la_num = 1; strncpy(la[0].param_ip, "0.0.0.0", 32); inet_aton(la[0].param_ip, &la[0].listenip); la[0].param_port = 80; printf("Default listen address:\n\t%s:%d\n", la[0].param_ip, la[0].param_port); } printf("\n"); if (pa_num) { int i; printf("Proxy mode is enabled, back-end address:\n"); if (enable_keepalive) printf("HTTP keepalive is not supported in the proxy mode so far and therefore is disabled\n\n"); enable_keepalive = 0; for (i = 0; i < pa_num; i++) { printf("\t%s:%d\n", pa[i].param_ip, pa[i].param_port); } printf("\n"); } if (enable_debug) printf("Debug Mode is enabled\n\n"); if (enable_keepalive) printf("HTTP keepalive is enabled\n\n"); if (process_mode) printf("Process Mode is enable with %d workers\n\n", num_workers); init_log(); init_server(); init_signal(); init_workers(); init_timer(); do_stats(); return 0; }
int checkcpu (void) { #if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */ uint pvr = get_pvr(); ulong clock = gd->cpu_clk; char buf[32]; #if defined(CONFIG_460EX) || defined(CONFIG_460GT) u32 reg; #endif #if !defined(CONFIG_IOP480) char addstr[64] = ""; sys_info_t sys_info; int cpu_num; cpu_num = get_cpu_num(); if (cpu_num >= 0) printf("CPU%d: ", cpu_num); else puts("CPU: "); get_sys_info(&sys_info); #if defined(CONFIG_XILINX_440) puts("IBM PowerPC 4"); #else puts("AMCC PowerPC 4"); #endif #if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \ defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \ defined(CONFIG_405EX) puts("05"); #endif #if defined(CONFIG_440) #if defined(CONFIG_460EX) || defined(CONFIG_460GT) puts("60"); #else puts("40"); #endif #endif switch (pvr) { case PVR_405GP_RB: puts("GP Rev. B"); break; case PVR_405GP_RC: puts("GP Rev. C"); break; case PVR_405GP_RD: puts("GP Rev. D"); break; #ifdef CONFIG_405GP case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */ puts("GP Rev. E"); break; #endif case PVR_405CR_RA: puts("CR Rev. A"); break; case PVR_405CR_RB: puts("CR Rev. B"); break; #ifdef CONFIG_405CR case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */ puts("CR Rev. C"); break; #endif case PVR_405GPR_RB: puts("GPr Rev. B"); break; case PVR_405EP_RB: puts("EP Rev. B"); break; case PVR_405EZ_RA: puts("EZ Rev. A"); break; case PVR_405EX1_RA: puts("EX Rev. A"); strcpy(addstr, "Security support"); break; case PVR_405EXR2_RA: puts("EXr Rev. A"); strcpy(addstr, "No Security support"); break; case PVR_405EX1_RC: puts("EX Rev. C"); strcpy(addstr, "Security support"); break; case PVR_405EX2_RC: puts("EX Rev. C"); strcpy(addstr, "No Security support"); break; case PVR_405EXR1_RC: puts("EXr Rev. C"); strcpy(addstr, "Security support"); break; case PVR_405EXR2_RC: puts("EXr Rev. C"); strcpy(addstr, "No Security support"); break; case PVR_405EX1_RD: puts("EX Rev. D"); strcpy(addstr, "Security support"); break; case PVR_405EX2_RD: puts("EX Rev. D"); strcpy(addstr, "No Security support"); break; case PVR_405EXR1_RD: puts("EXr Rev. D"); strcpy(addstr, "Security support"); break; case PVR_405EXR2_RD: puts("EXr Rev. D"); strcpy(addstr, "No Security support"); break; #if defined(CONFIG_440) case PVR_440GP_RB: puts("GP Rev. B"); /* See errata 1.12: CHIP_4 */ if ((mfdcr(CPC0_SYS0) != mfdcr(CPC0_STRP0)) || (mfdcr(CPC0_SYS1) != mfdcr(CPC0_STRP1)) ){ puts ( "\n\t CPC0_SYSx DCRs corrupted. " "Resetting chip ...\n"); udelay( 1000 * 1000 ); /* Give time for serial buf to clear */ do_chip_reset ( mfdcr(CPC0_STRP0), mfdcr(CPC0_STRP1) ); } break; case PVR_440GP_RC: puts("GP Rev. C"); break; case PVR_440GX_RA: puts("GX Rev. A"); break; case PVR_440GX_RB: puts("GX Rev. B"); break; case PVR_440GX_RC: puts("GX Rev. C"); break; case PVR_440GX_RF: puts("GX Rev. F"); break; case PVR_440EP_RA: puts("EP Rev. A"); break; #ifdef CONFIG_440EP case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */ puts("EP Rev. B"); break; case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */ puts("EP Rev. C"); break; #endif /* CONFIG_440EP */ #ifdef CONFIG_440GR case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */ puts("GR Rev. A"); break; case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */ puts("GR Rev. B"); break; #endif /* CONFIG_440GR */ #endif /* CONFIG_440 */ #ifdef CONFIG_440EPX case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */ puts("EPx Rev. A"); strcpy(addstr, "Security/Kasumi support"); break; case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */ puts("EPx Rev. A"); strcpy(addstr, "No Security/Kasumi support"); break; #endif /* CONFIG_440EPX */ #ifdef CONFIG_440GRX case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */ puts("GRx Rev. A"); strcpy(addstr, "Security/Kasumi support"); break; case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */ puts("GRx Rev. A"); strcpy(addstr, "No Security/Kasumi support"); break; #endif /* CONFIG_440GRX */ case PVR_440SP_6_RAB: puts("SP Rev. A/B"); strcpy(addstr, "RAID 6 support"); break; case PVR_440SP_RAB: puts("SP Rev. A/B"); strcpy(addstr, "No RAID 6 support"); break; case PVR_440SP_6_RC: puts("SP Rev. C"); strcpy(addstr, "RAID 6 support"); break; case PVR_440SP_RC: puts("SP Rev. C"); strcpy(addstr, "No RAID 6 support"); break; case PVR_440SPe_6_RA: puts("SPe Rev. A"); strcpy(addstr, "RAID 6 support"); break; case PVR_440SPe_RA: puts("SPe Rev. A"); strcpy(addstr, "No RAID 6 support"); break; case PVR_440SPe_6_RB: puts("SPe Rev. B"); strcpy(addstr, "RAID 6 support"); break; case PVR_440SPe_RB: puts("SPe Rev. B"); strcpy(addstr, "No RAID 6 support"); break; #if defined(CONFIG_460EX) || defined(CONFIG_460GT) case PVR_460EX_RA: puts("EX Rev. A"); strcpy(addstr, "No Security/Kasumi support"); break; case PVR_460EX_SE_RA: puts("EX Rev. A"); strcpy(addstr, "Security/Kasumi support"); break; case PVR_460EX_RB: puts("EX Rev. B"); mfsdr(SDR0_ECID3, reg); if (reg & 0x00100000) strcpy(addstr, "No Security/Kasumi support"); else strcpy(addstr, "Security/Kasumi support"); break; case PVR_460GT_RA: puts("GT Rev. A"); strcpy(addstr, "No Security/Kasumi support"); break; case PVR_460GT_SE_RA: puts("GT Rev. A"); strcpy(addstr, "Security/Kasumi support"); break; case PVR_460GT_RB: puts("GT Rev. B"); mfsdr(SDR0_ECID3, reg); if (reg & 0x00100000) strcpy(addstr, "No Security/Kasumi support"); else strcpy(addstr, "Security/Kasumi support"); break; #endif case PVR_460SX_RA: puts("SX Rev. A"); strcpy(addstr, "Security support"); break; case PVR_460SX_RA_V1: puts("SX Rev. A"); strcpy(addstr, "No Security support"); break; case PVR_460GX_RA: puts("GX Rev. A"); strcpy(addstr, "Security support"); break; case PVR_460GX_RA_V1: puts("GX Rev. A"); strcpy(addstr, "No Security support"); break; case PVR_VIRTEX5: puts("x5 VIRTEX5"); break; default: printf (" UNKNOWN (PVR=%08x)", pvr); break; } printf (" at %s MHz (PLB=%lu OPB=%lu EBC=%lu", strmhz(buf, clock), sys_info.freqPLB / 1000000, get_OPB_freq() / 1000000, sys_info.freqEBC / 1000000); #if defined(CONFIG_PCI) && \ (defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \ defined(CONFIG_440GR) || defined(CONFIG_440GRX)) printf(" PCI=%lu MHz", sys_info.freqPCI / 1000000); #endif printf(")\n"); if (addstr[0] != 0) printf(" %s\n", addstr); #if defined(I2C_BOOTROM) printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis"); #endif /* I2C_BOOTROM */ #if defined(SDR0_PINSTP_SHIFT) printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]); printf ("Boot ROM Location %s", bootstrap_str[bootstrap_option()]); #ifdef CONFIG_NAND_U_BOOT puts(", booting from NAND"); #endif /* CONFIG_NAND_U_BOOT */ putc('\n'); #endif /* SDR0_PINSTP_SHIFT */ #if defined(CONFIG_PCI) && !defined(CONFIG_405EX) printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis"); #endif #if defined(CONFIG_PCI) && defined(PCI_ASYNC) if (pci_async_enabled()) { printf (", PCI async ext clock used"); } else { printf (", PCI sync clock at %lu MHz", sys_info.freqPLB / sys_info.pllPciDiv / 1000000); } #endif #if defined(CONFIG_PCI) && !defined(CONFIG_405EX) putc('\n'); #endif #if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX) printf (" 16 kB I-Cache 16 kB D-Cache"); #elif defined(CONFIG_440) printf (" 32 kB I-Cache 32 kB D-Cache"); #else printf (" 16 kB I-Cache %d kB D-Cache", ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8); #endif #endif /* !defined(CONFIG_IOP480) */ #if defined(CONFIG_IOP480) printf ("PLX IOP480 (PVR=%08x)", pvr); printf (" at %s MHz:", strmhz(buf, clock)); printf (" %u kB I-Cache", 4); printf (" %u kB D-Cache", 2); #endif #endif /* !defined(CONFIG_405) */ putc ('\n'); return 0; }
int SYSTEM_CPU_LOAD(AGENT_REQUEST *request, AGENT_RESULT *result) { char *tmp, *error = NULL; double value; int cpu_num, ret = FAIL; if (0 == CPU_COLLECTOR_STARTED(collector)) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Collector is not started.")); return SYSINFO_RET_FAIL; } if (2 < request->nparam) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); return SYSINFO_RET_FAIL; } if (NULL == (tmp = get_rparam(request, 0)) || '\0' == *tmp || 0 == strcmp(tmp, "all")) { cpu_num = 1; } else if (0 == strcmp(tmp, "percpu")) { if (0 >= (cpu_num = get_cpu_num())) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain number of CPUs.")); return SYSINFO_RET_FAIL; } } else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); return SYSINFO_RET_FAIL; } if (NULL == (tmp = get_rparam(request, 1)) || '\0' == *tmp || 0 == strcmp(tmp, "avg1")) { ret = get_perf_counter_value(collector->cpus.queue_counter, 1 * SEC_PER_MIN, &value, &error); } else if (0 == strcmp(tmp, "avg5")) { ret = get_perf_counter_value(collector->cpus.queue_counter, 5 * SEC_PER_MIN, &value, &error); } else if (0 == strcmp(tmp, "avg15")) { ret = get_perf_counter_value(collector->cpus.queue_counter, 15 * SEC_PER_MIN, &value, &error); } else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter.")); return SYSINFO_RET_FAIL; } if (SUCCEED == ret) { SET_DBL_RESULT(result, value / cpu_num); return SYSINFO_RET_OK; } SET_MSG_RESULT(result, NULL != error ? error : zbx_strdup(NULL, "Cannot obtain performance information from collector.")); return SYSINFO_RET_FAIL; }
int merry_start(int argc, const char **argv, void (*help)(), void (*master)(), void (*onexit)(), void (*worker)(), int worker_count) { update_time(); /// 初始化进程命令行信息 init_process_title(argc, argv); int i = strlen(argv[0]); while(argv[0][--i] != '/'); program_name = argv[0] + i + 1; if(getarg("help")) { help(); exit(0); } if(getarg("log")) { LOGF_T = open_log(getarg("log"), 40960); // filename, bufsize } /// 把进程放入后台 if(getarg("daemon")) { daemonize(); } process_count = 1; if(is_daemon == 1) { process_count = atoi(getarg("daemon")); if(process_count < 1) { process_count = get_cpu_num(); } if(process_count < 1) { process_count = 1; } } if(worker_count > 0 && process_count > worker_count) { process_count = worker_count; } sprintf(bind_addr, "0.0.0.0"); if(getarg("bind")) { if(strstr(getarg("bind"), ".")) { sprintf(bind_addr, "%s", getarg("bind")); } else { int _be_port = atoi(getarg("bind")); if(_be_port > 0) { bind_port = _be_port; } } } char *_port = strstr(bind_addr, ":"); if(_port) { bind_addr[strlen(bind_addr) - strlen(_port)] = '\0'; _port = _port + 1; if(atoi(_port) > 0 && atoi(_port) < 99999) { bind_port = atoi(_port); } } sprintf(ssl_bind_addr, "0.0.0.0"); if(getarg("ssl-bind")) { if(strstr(getarg("ssl-bind"), ".")) { sprintf(ssl_bind_addr, "%s", getarg("ssl-bind")); _port = strstr(ssl_bind_addr, ":"); if(_port) { ssl_bind_addr[strlen(ssl_bind_addr) - strlen(_port)] = '\0'; _port = _port + 1; if(atoi(_port) > 0 && atoi(_port) < 99999) { ssl_bind_port = atoi(_port); } } } else { int _be_port = atoi(getarg("ssl-bind")); if(_be_port > 0) { ssl_bind_port = _be_port; } } } server_fd = network_bind(bind_addr, bind_port); if(ssl_bind_port > 0) { ssl_server_fd = network_bind(ssl_bind_addr, ssl_bind_port); LOGF(INFO, "bind %s:%d ssl:%d", bind_addr, bind_port, ssl_bind_port); } else { LOGF(INFO, "bind %s:%d", bind_addr, bind_port); } for(i = 0; i < process_count; i++) { if(is_daemon == 1) { fork_process(worker); } else { set_cpu_affinity(0); new_thread_p(worker, 0); } } /// 进入主进程处理 start_master_main(master, onexit); return 1; }