/*----------------------------------------------------------------------------*/ int main(int argc, char **argv) { DIR *dir; struct dirent *ent; int fd; int ret; uint64_t total_read; int cores[MAX_CPUS]; int i; num_cores = GetNumCPUs(); core_limit = num_cores; finished = 0; /* initialize mtcp */ ret = mtcp_init("epserver.conf"); if (ret) { TRACE_ERROR("Failed to initialize mtcp\n"); exit(EXIT_FAILURE); } /* register signal handler to mtcp */ mtcp_register_signal(SIGINT, SignalHandler); TRACE_INFO("Application initialization finished.\n"); for (i = 0; i < core_limit; i++) { cores[i] = i; done[i] = FALSE; if (pthread_create(&app_thread[i], NULL, RunServerThread, (void *)&cores[i])) { perror("pthread_create"); TRACE_ERROR("Failed to create server thread.\n"); exit(-1); } } for (i = 0; i < core_limit; i++) { pthread_join(app_thread[i], NULL); } mtcp_destroy(); // closedir(dir); return 0; }
/* * @brief Returns the number of threads to use for calculation * * @return Number of threads to use for calculation */ size_t GetNumThreads(const size_t arraySize) { #ifdef LIBHVL_USE_CPP17 const int cacheLineSize = std::hardware_destructive_interference_size; #else const int cacheLineSize = 64; /* Assume 64-byte L1 cache line size */ #endif //LIBHVL_USE_CPP17 const size_t numCPU = GetNumCPUs(); const size_t maxChunks = arraySize * sizeof(double) / cacheLineSize; if (maxChunks < 1) return 1; if (maxChunks < numCPU) return maxChunks; return numCPU; }
/*----------------------------------------------------------------------------*/ int mtcp_core_affinitize(int cpu) { #ifndef DISABLE_NUMA struct bitmask *bmask; #endif /* DISABLE_NUMA */ cpu_set_t cpus; FILE *fp; char sysfname[MAX_FILE_NAME]; int phy_id; size_t n; int ret; n = GetNumCPUs(); if (cpu < 0 || cpu >= (int) n) { errno = -EINVAL; return -1; } CPU_ZERO(&cpus); CPU_SET((unsigned)cpu, &cpus); ret = sched_setaffinity(Gettid(), sizeof(cpus), &cpus); #ifndef DISABLE_NUMA if (numa_max_node() == 0) return ret; bmask = numa_bitmask_alloc(n); assert(bmask); #endif /* DISABLE_NUMA */ /* read physical id of the core from sys information */ snprintf(sysfname, MAX_FILE_NAME - 1, "/sys/devices/system/cpu/cpu%d/topology/physical_package_id", cpu); fp = fopen(sysfname, "r"); if (!fp) { perror(sysfname); errno = EFAULT; return -1; } ret = fscanf(fp, "%d", &phy_id); if (ret != 1) { perror("Fail to read core id"); errno = EFAULT; return -1; } #ifndef DISABLE_NUMA numa_bitmask_setbit(bmask, phy_id); numa_set_membind(bmask); numa_bitmask_free(bmask); #endif /* DISABLE_NUMA */ fclose(fp); return ret; }
/*----------------------------------------------------------------------------*/ int main(int argc, char **argv) { DIR *dir; struct dirent *ent; int fd; int ret; uint64_t total_read; int cores[MAX_CPUS]; int i; num_cores = GetNumCPUs(); core_limit = num_cores; if (argc < 2) { TRACE_ERROR("$%s directory_to_service\n", argv[0]); return FALSE; } /* open the directory to serve */ www_main = argv[1]; dir = opendir(www_main); if (!dir) { TRACE_ERROR("Failed to open %s.\n", www_main); perror("opendir"); return FALSE; } for (i = 0; i < argc - 1; i++) { if (strcmp(argv[i], "-N") == 0) { core_limit = atoi(argv[i + 1]); if (core_limit > num_cores) { TRACE_CONFIG("CPU limit should be smaller than the " "number of CPUS: %d\n", num_cores); return FALSE; } } } nfiles = 0; while ((ent = readdir(dir)) != NULL) { if (strcmp(ent->d_name, ".") == 0) continue; else if (strcmp(ent->d_name, "..") == 0) continue; strcpy(fcache[nfiles].name, ent->d_name); sprintf(fcache[nfiles].fullname, "%s/%s", www_main, ent->d_name); fd = open(fcache[nfiles].fullname, O_RDONLY); if (fd < 0) { perror("open"); continue; } else { fcache[nfiles].size = lseek64(fd, 0, SEEK_END); lseek64(fd, 0, SEEK_SET); } fcache[nfiles].file = (char *)malloc(fcache[nfiles].size); if (!fcache[nfiles].file) { TRACE_ERROR("Failed to allocate memory for file %s\n", fcache[nfiles].name); perror("malloc"); continue; } TRACE_INFO("Reading %s (%lu bytes)\n", fcache[nfiles].name, fcache[nfiles].size); total_read = 0; while (1) { ret = read(fd, fcache[nfiles].file + total_read, fcache[nfiles].size - total_read); if (ret < 0) { break; } else if (ret == 0) { break; } total_read += ret; } if (total_read < fcache[nfiles].size) { free(fcache[nfiles].file); continue; } close(fd); nfiles++; if (nfiles >= MAX_FILES) break; } finished = 0; /* initialize mtcp */ ret = mtcp_init("epserver.conf"); if (ret) { TRACE_ERROR("Failed to initialize mtcp\n"); exit(EXIT_FAILURE); } /* register signal handler to mtcp */ mtcp_register_signal(SIGINT, SignalHandler); TRACE_INFO("Application initialization finished.\n"); for (i = 0; i < core_limit; i++) { cores[i] = i; done[i] = FALSE; if (pthread_create(&app_thread[i], NULL, RunServerThread, (void *)&cores[i])) { perror("pthread_create"); TRACE_ERROR("Failed to create server thread.\n"); exit(-1); } } for (i = 0; i < core_limit; i++) { pthread_join(app_thread[i], NULL); } mtcp_destroy(); closedir(dir); return 0; }
/*----------------------------------------------------------------------------*/ int main(int argc, char **argv) { DIR *dir; struct dirent *ent; int fd; int ret; uint64_t total_read; struct mtcp_conf mcfg; int cores[MAX_CPUS]; int process_cpu; int i, o; num_cores = GetNumCPUs(); core_limit = num_cores; process_cpu = -1; dir = NULL; if (argc < 2) { TRACE_CONFIG("$%s directory_to_service\n", argv[0]); return FALSE; } while (-1 != (o = getopt(argc, argv, "N:f:p:c:h"))) { switch (o) { case 'p': /* open the directory to serve */ www_main = optarg; dir = opendir(www_main); if (!dir) { TRACE_CONFIG("Failed to open %s.\n", www_main); perror("opendir"); return FALSE; } break; case 'N': core_limit = atoi(optarg); if (core_limit > num_cores) { TRACE_CONFIG("CPU limit should be smaller than the " "number of CPUs: %d\n", num_cores); return FALSE; } /** * it is important that core limit is set * before mtcp_init() is called. You can * not set core_limit after mtcp_init() */ mtcp_getconf(&mcfg); mcfg.num_cores = core_limit; mtcp_setconf(&mcfg); break; case 'f': conf_file = optarg; break; case 'c': process_cpu = atoi(optarg); if (process_cpu > core_limit) { TRACE_CONFIG("Starting CPU is way off limits!\n"); return FALSE; } break; case 'h': printHelp(argv[0]); break; } } if (dir == NULL) { TRACE_CONFIG("You did not pass a valid www_path!\n"); exit(EXIT_FAILURE); } nfiles = 0; while ((ent = readdir(dir)) != NULL) { if (strcmp(ent->d_name, ".") == 0) continue; else if (strcmp(ent->d_name, "..") == 0) continue; strcpy(fcache[nfiles].name, ent->d_name); sprintf(fcache[nfiles].fullname, "%s/%s", www_main, ent->d_name); fd = open(fcache[nfiles].fullname, O_RDONLY); if (fd < 0) { perror("open"); continue; } else { fcache[nfiles].size = lseek64(fd, 0, SEEK_END); lseek64(fd, 0, SEEK_SET); } fcache[nfiles].file = (char *)malloc(fcache[nfiles].size); if (!fcache[nfiles].file) { TRACE_CONFIG("Failed to allocate memory for file %s\n", fcache[nfiles].name); perror("malloc"); continue; } TRACE_INFO("Reading %s (%lu bytes)\n", fcache[nfiles].name, fcache[nfiles].size); total_read = 0; while (1) { ret = read(fd, fcache[nfiles].file + total_read, fcache[nfiles].size - total_read); if (ret < 0) { break; } else if (ret == 0) { break; } total_read += ret; } if (total_read < fcache[nfiles].size) { free(fcache[nfiles].file); continue; } close(fd); nfiles++; if (nfiles >= MAX_FILES) break; } finished = 0; /* initialize mtcp */ if (conf_file == NULL) { TRACE_CONFIG("You forgot to pass the mTCP startup config file!\n"); exit(EXIT_FAILURE); } ret = mtcp_init(conf_file); if (ret) { TRACE_CONFIG("Failed to initialize mtcp\n"); exit(EXIT_FAILURE); } /* register signal handler to mtcp */ mtcp_register_signal(SIGINT, SignalHandler); TRACE_INFO("Application initialization finished.\n"); for (i = ((process_cpu == -1) ? 0 : process_cpu); i < core_limit; i++) { cores[i] = i; done[i] = FALSE; if (pthread_create(&app_thread[i], NULL, RunServerThread, (void *)&cores[i])) { perror("pthread_create"); TRACE_CONFIG("Failed to create server thread.\n"); exit(EXIT_FAILURE); } if (process_cpu != -1) break; } for (i = ((process_cpu == -1) ? 0 : process_cpu); i < core_limit; i++) { pthread_join(app_thread[i], NULL); if (process_cpu != -1) break; } mtcp_destroy(); closedir(dir); return 0; }