diff options
Diffstat (limited to 'video_in_hal/systemservice/resource_manager/server/src/cpuload_custom.cpp')
-rwxr-xr-x | video_in_hal/systemservice/resource_manager/server/src/cpuload_custom.cpp | 512 |
1 files changed, 0 insertions, 512 deletions
diff --git a/video_in_hal/systemservice/resource_manager/server/src/cpuload_custom.cpp b/video_in_hal/systemservice/resource_manager/server/src/cpuload_custom.cpp deleted file mode 100755 index c6a8e75..0000000 --- a/video_in_hal/systemservice/resource_manager/server/src/cpuload_custom.cpp +++ /dev/null @@ -1,512 +0,0 @@ -/* - * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <stdio.h> -#include <sys/types.h> -#include <dirent.h> -#include <string.h> -#include <errno.h> -#include <sched.h> -#include <stdlib.h> -#include <time.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> - -#include "ss_resm_resourcemanagerlog.h" - -#include "resm_cfg.h" - -typedef struct _task_stat { - struct _task_stat *next; - char path[64]; - pid_t pid_nr_ns; - char tcomm[64]; - char state; - pid_t ppid; - pid_t pgid; - unsigned long utime; // NOLINT - unsigned long stime; // NOLINT - int priority; - int nice; - int task_cpu; - unsigned int task_rt_priority; - unsigned int task_policy; -} TASK_STAT; - - -typedef struct _task_rank -{ - pid_t pid_nr_ns; - char state; - unsigned long taskOccupancy; - unsigned long utime; - unsigned long stime; - int priority; - unsigned int task_policy; - int task_cpu; - char tcomm[64]; -} TASK_RANK; - - -static TASK_STAT *g_task_stat = NULL; - -static int32_t g_fifo_task_pid = -1; -static int32_t g_tss_task_pid = -1; -static unsigned long g_fifo_task_occ = -1; -static unsigned long g_tss_task_occ = -1; -static int32_t g_fifo_show_timer = 0; -static int32_t g_tss_show_timer = 0; -static unsigned int g_startTime = 0; -static char g_fifo_path[64]; -static char g_tss_path[64]; -static unsigned long g_fifo_utime; -static unsigned long g_fifo_stime; -static unsigned long g_tss_utime; -static unsigned long g_tss_stime; - - -static void cleanup_task_stat(void) { - TASK_STAT *p, *q; - - p = g_task_stat; - while (p) { - q = p->next; - free(p); - p = q; - } - g_task_stat = NULL; -} - -static int add_task_stat(TASK_STAT *tstat) { - TASK_STAT *p; - - p = reinterpret_cast<TASK_STAT *>(malloc(sizeof(TASK_STAT))); - if (p == NULL) { // LCOV_EXCL_BR_LINE 5: malloc error case - AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert - return -1; // LCOV_EXCL_LINE 5: malloc error case - } - memcpy(p, tstat, sizeof(TASK_STAT)); - p->next = 0; - - if (g_task_stat) { - p->next = g_task_stat; - } - g_task_stat = p; - - return 0; -} - -// No error : > 0 -static int get_task_stat(const char *path, TASK_STAT *tstat) { - pid_t sid; - int tty_nr, tty_pgrp; - unsigned long task_flags; // NOLINT - unsigned long min_flt, cmin_flt, maj_flt, cmaj_flt; // NOLINT - signed long cutime, cstime; // NOLINT - int num_threads, zero1; - unsigned long long start_time; // NOLINT - unsigned long vsize, mm_rss, rsslim, start_code, end_code, start_stack; // NOLINT - unsigned long esp, eip, task_pending_signal_sig, task_blocked_sig; // NOLINT - unsigned long sigign_sig, sigcatch_sig, wchan, zero2, zero3; // NOLINT - int exit_signal; - unsigned long long delayacct_blkio_ticks; // NOLINT - unsigned long guest_time; // NOLINT - signed long cguest_time; // NOLINT - - int fd; - int ret = -1; -#define READ_MAX_SIZE 4096 - char buf[READ_MAX_SIZE]; - - fd = open(path, O_RDONLY); - if (fd != -1) { - if (read(fd, buf, sizeof(buf)) != -1) { // LCOV_EXCL_BR_LINE 5: read's error case - ret = - sscanf( - buf, - "%d %32s %c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %ld %ld %d %d %d %d %llu %lu %lu" - " %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %d %d %u %u %llu %lu %ld", - &(tstat->pid_nr_ns), tstat->tcomm, &(tstat->state), - &(tstat->ppid), &(tstat->pgid), &sid, &tty_nr, &tty_pgrp, - &task_flags, &min_flt, &cmin_flt, &maj_flt, &cmaj_flt, - &(tstat->utime), &(tstat->stime), &cutime, &cstime, - &(tstat->priority), &(tstat->nice), &num_threads, &zero1, - &start_time, &vsize, &mm_rss, &rsslim, &start_code, &end_code, - &start_stack, &esp, &eip, &task_pending_signal_sig, - &task_blocked_sig, &sigign_sig, &sigcatch_sig, &wchan, &zero2, - &zero3, &exit_signal, &(tstat->task_cpu), - &(tstat->task_rt_priority), &(tstat->task_policy), - &delayacct_blkio_ticks, &guest_time, &cguest_time); - } - close(fd); - } - return ret; -} - -static void get_current_task_stat(void) { - TASK_STAT tstat; - DIR *dirp; - struct dirent entry; - struct dirent *result; - char path[64]; - - struct timespec tp; - - dirp = opendir("/proc"); - if (dirp == NULL) { // LCOV_EXCL_BR_LINE 5: opendir error case - AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert - return; // LCOV_EXCL_LINE 5: opendir error case - } - - if (clock_gettime (CLOCK_MONOTONIC, &tp) == 0) { - g_startTime = ((tp.tv_sec * 1000) + (tp.tv_nsec / 1000000)); // Unit is msec - } else { - g_startTime = 0; - } - - while ((readdir_r(dirp, &entry, &result) == 0) && (result != NULL)) { - if ((entry.d_name[0] >= '1') && (entry.d_name[0] <= '9')) { - DIR *dirp2; - struct dirent entry2; - struct dirent *result2; - - sprintf(path, "/proc/%s/task", entry.d_name); // NOLINT - dirp2 = opendir(path); - if (dirp2 == NULL) { // LCOV_EXCL_BR_LINE 5: opendir error case - AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert - continue; // LCOV_EXCL_LINE 5: opendir error case - } - - while ((readdir_r(dirp2, &entry2, &result2) == 0) && (result2 != NULL)) { - if ((entry2.d_name[0] >= '1') && (entry2.d_name[0] <= '9')) { - char path2[64]; - int ret; - struct timespec req = { 0, 1000000 }; // 1msec - - sprintf(path2, "%s/%s/stat", path, entry2.d_name); // NOLINT - ret = get_task_stat(path2, &tstat); - -// if ((ret > 0) && (tstat.task_policy == SCHED_FIFO)) { - if (ret > 0) { // LCOV_EXCL_BR_LINE 200: ret must be bigger than 0 - - strcpy(tstat.path, path2); // NOLINT - add_task_stat(&tstat); - } - nanosleep(&req, NULL); - } - } - closedir(dirp2); - } - } - closedir(dirp); -} - -static void show_cpuload(void) { - int ret; - TASK_STAT tstat; - TASK_STAT *p = g_task_stat; - - TASK_RANK ttaskRankData[TASK_STAT_RANK_NUM+1]; - TASK_RANK t_eva_taskRank; - int setRankDatanum = 0; - int checkCounter; - - unsigned long dtime; // NOLINT - unsigned long dtime_urank; - unsigned long dtime_drank; - struct timespec tp; - unsigned int endTime = 0; - -// if (p) { -// FRAMEWORKUNIFIEDLOG( -// ZONE_INFO, -// __FUNCTION__, -// "[CpuHighLoad]Please check User backtrace of following processes in kernel.log"); -// FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, -// "[CpuHighLoad] PID ST PRI POLICY cpuX %%CPU (ut:st) comm"); -// } - if (clock_gettime (CLOCK_MONOTONIC, &tp) == 0) { - endTime = ((tp.tv_sec * 1000) + (tp.tv_nsec / 1000000)); // Unit is msec - } else { - endTime = (WTC_CPU_INTERVAL * 1000) + g_startTime; - } - if (endTime - g_startTime <= 0) { // LCOV_EXCL_BR_LINE 200: (endTime - g_startTime) must be bigger than 0 - // LCOV_EXCL_START 200: (endTime - g_startTime) must be bigger than 0 - AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert - FRAMEWORKUNIFIEDLOG (ZONE_WARN, __FUNCTION__, "[CpuHighLoad] Timer abnormality."); - endTime = g_startTime + 1; - // LCOV_EXCL_STOP - } - - while (p) { - ret = get_task_stat(p->path, &tstat); - if (ret >= 0) { - -#if 0 - dtime = (tstat.utime + tstat.stime) - (p->utime + p->stime); - if (dtime > 0) { - FRAMEWORKUNIFIEDLOG( - ZONE_INFO, - __FUNCTION__, - "[CpuHighLoad]%5d %c %3d %5s cpu%d %4lu (%lu:%lu) %s", - p->pid_nr_ns, - p->state, - p->priority, - p->task_policy == SCHED_FIFO ? "FIFO" : - p->task_policy == SCHED_RR ? "RR" : "OTHER", - p->task_cpu, dtime, tstat.utime - p->utime, tstat.stime - p->stime, - p->tcomm); - if ((dtime >= 70) // %%CPU 70% over only - && (getpid() != p->pid_nr_ns) // except current process - && (strcmp(p->tcomm, "(NS_BackupMgr)"))) { // except "BackupMgr" -// print_backtrace_pid (p->pid_nr_ns); // backtrace in kernel.log - } - } - } - p = p->next; - } -#endif - dtime = (((tstat.utime + tstat.stime) - (p->utime + p->stime)) * 1000) / (endTime - g_startTime); - if (((tstat.utime + tstat.stime) - (p->utime + p->stime)) > 0) { - if (setRankDatanum <= TASK_STAT_RANK_NUM) { - ttaskRankData[setRankDatanum].pid_nr_ns = p->pid_nr_ns; - ttaskRankData[setRankDatanum].state = p->state; - ttaskRankData[setRankDatanum].priority = p->priority; - ttaskRankData[setRankDatanum].task_policy = p->task_policy; - ttaskRankData[setRankDatanum].task_cpu = p->task_cpu; - ttaskRankData[setRankDatanum].taskOccupancy = dtime; - ttaskRankData[setRankDatanum].utime = tstat.utime - p->utime; - ttaskRankData[setRankDatanum].stime = tstat.stime - p->stime; - strcpy(ttaskRankData[setRankDatanum].tcomm, p->tcomm); - setRankDatanum++; - } else { - ttaskRankData[TASK_STAT_RANK_NUM].pid_nr_ns = p->pid_nr_ns; - ttaskRankData[TASK_STAT_RANK_NUM].state = p->state; - ttaskRankData[TASK_STAT_RANK_NUM].priority = p->priority; - ttaskRankData[TASK_STAT_RANK_NUM].task_policy = p->task_policy; - ttaskRankData[TASK_STAT_RANK_NUM].task_cpu = p->task_cpu; - ttaskRankData[TASK_STAT_RANK_NUM].taskOccupancy = dtime; - ttaskRankData[TASK_STAT_RANK_NUM].utime = tstat.utime - p->utime; - ttaskRankData[TASK_STAT_RANK_NUM].stime = tstat.stime - p->stime; - strcpy(ttaskRankData[TASK_STAT_RANK_NUM].tcomm, p->tcomm); - } - for (checkCounter = (setRankDatanum - 1); checkCounter > 0; checkCounter--) { - dtime_urank = ttaskRankData[checkCounter - 1].utime + ttaskRankData[checkCounter - 1].stime; - dtime_drank = ttaskRankData[checkCounter].utime + ttaskRankData[checkCounter].stime; - if (dtime_urank < dtime_drank) { - t_eva_taskRank.pid_nr_ns = ttaskRankData[checkCounter].pid_nr_ns; - t_eva_taskRank.state = ttaskRankData[checkCounter].state; - t_eva_taskRank.priority = ttaskRankData[checkCounter].priority; - t_eva_taskRank.task_policy = ttaskRankData[checkCounter].task_policy; - t_eva_taskRank.task_cpu = ttaskRankData[checkCounter].task_cpu; - t_eva_taskRank.taskOccupancy = ttaskRankData[checkCounter].taskOccupancy; - t_eva_taskRank.utime = ttaskRankData[checkCounter].utime; - t_eva_taskRank.stime = ttaskRankData[checkCounter].stime; - strcpy(t_eva_taskRank.tcomm, ttaskRankData[checkCounter].tcomm); - - ttaskRankData[checkCounter].pid_nr_ns = ttaskRankData[checkCounter - 1].pid_nr_ns; - ttaskRankData[checkCounter].state = ttaskRankData[checkCounter - 1].state; - ttaskRankData[checkCounter].priority = ttaskRankData[checkCounter - 1].priority; - ttaskRankData[checkCounter].task_policy = ttaskRankData[checkCounter - 1].task_policy; - ttaskRankData[checkCounter].task_cpu = ttaskRankData[checkCounter - 1].task_cpu; - ttaskRankData[checkCounter].taskOccupancy = ttaskRankData[checkCounter - 1].taskOccupancy; - ttaskRankData[checkCounter].utime = ttaskRankData[checkCounter - 1].utime; - ttaskRankData[checkCounter].stime = ttaskRankData[checkCounter - 1].stime; - strcpy(ttaskRankData[checkCounter].tcomm, ttaskRankData[checkCounter - 1].tcomm); - - ttaskRankData[checkCounter - 1].pid_nr_ns = t_eva_taskRank.pid_nr_ns; - ttaskRankData[checkCounter - 1].state = t_eva_taskRank.state; - ttaskRankData[checkCounter - 1].priority = t_eva_taskRank.priority; - ttaskRankData[checkCounter - 1].task_policy = t_eva_taskRank.task_policy; - ttaskRankData[checkCounter - 1].task_cpu = t_eva_taskRank.task_cpu; - ttaskRankData[checkCounter - 1].taskOccupancy = t_eva_taskRank.taskOccupancy; - ttaskRankData[checkCounter - 1].utime = t_eva_taskRank.utime; - ttaskRankData[checkCounter - 1].stime = t_eva_taskRank.stime; - strcpy(ttaskRankData[checkCounter - 1].tcomm, t_eva_taskRank.tcomm); - } else { - break; - } - } - if ((dtime >= TASK_STAT_THRESHOLD) && // %%CPU over only - (getpid() != p->pid_nr_ns) && // except current process - (strcmp (p->tcomm, "(NS_BackupMgr)"))) { // except "BackupMgr" - if (p->task_policy == SCHED_FIFO) { - if ((g_fifo_task_occ < dtime) && (g_fifo_show_timer == 0)) { // first time only - g_fifo_task_pid = p->pid_nr_ns; - g_fifo_task_occ = dtime; - g_fifo_utime = tstat.utime; - g_fifo_stime = tstat.stime; - strcpy(g_fifo_path,p->path); - } else if (g_fifo_task_pid == p->pid_nr_ns) { - g_fifo_task_occ = dtime; - g_fifo_utime = tstat.utime; - g_fifo_stime = tstat.stime; - strcpy(g_fifo_path,p->path); - } - } else { - if ((g_tss_task_occ < dtime) && (g_tss_show_timer == 0)) { // first time only - g_tss_task_pid = p->pid_nr_ns; - g_tss_task_occ = dtime; - g_tss_utime = tstat.utime; - g_tss_stime = tstat.stime; - strcpy(g_tss_path,p->path); - } else if (g_tss_task_pid == p->pid_nr_ns) { - g_tss_task_occ = dtime; - g_tss_utime = tstat.utime; - g_tss_stime = tstat.stime; - strcpy(g_tss_path,p->path); - } - } - } - } - } - p = p->next; - } - - if (setRankDatanum != 0) { - FRAMEWORKUNIFIEDLOG (ZONE_WARN, __FUNCTION__, "[CpuHighLoad] PID ST PRI POLICY cpuX %%CPU (%%ut:%%st) comm"); - for (checkCounter = 0; - checkCounter < (setRankDatanum < TASK_STAT_RANK_NUM ? setRankDatanum : TASK_STAT_RANK_NUM); checkCounter++) { - FRAMEWORKUNIFIEDLOG (ZONE_WARN, __FUNCTION__, "[CpuHighLoad]%5d %c %3d %5s cpu%d %4lu (%2lu.%03lu:%2lu.%03lu) %s", - ttaskRankData[checkCounter].pid_nr_ns, - ttaskRankData[checkCounter].state, - ttaskRankData[checkCounter].priority, - ttaskRankData[checkCounter].task_policy == SCHED_FIFO ? "FIFO" - : ttaskRankData[checkCounter].task_policy == SCHED_RR ? "RR" : "TSS", - ttaskRankData[checkCounter].task_cpu, - ttaskRankData[checkCounter].taskOccupancy, - ttaskRankData[checkCounter].utime * 100 / ((endTime - g_startTime)/10), - ttaskRankData[checkCounter].utime * 100 % ((endTime - g_startTime)/10), - ttaskRankData[checkCounter].stime * 100 / ((endTime - g_startTime)/10), - ttaskRankData[checkCounter].stime * 100 % ((endTime - g_startTime)/10), - ttaskRankData[checkCounter].tcomm); - } - FRAMEWORKUNIFIEDLOG (ZONE_WARN, __FUNCTION__, "[CpuHighLoad] -------------------------------------------------"); - } - -} - - -static void -show_cpuload_onetask(int loadType) { - int ret; - TASK_STAT tstat; - unsigned long dtime; - struct timespec tp; - unsigned int endTime = 0; - char loadPath[64]; - unsigned long beforeUtime; - unsigned long beforeStime; - if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0) { - endTime = ((tp.tv_sec * 1000) + (tp.tv_nsec / 1000000)); // Unit is msec - } else { - endTime = (WTC_CPU_INTERVAL * 1000) + g_startTime; - } - if (endTime - g_startTime <= 0) { // LCOV_EXCL_BR_LINE 200: (endTime - g_startTime) must be bigger than 0 - // LCOV_EXCL_START 200: (endTime - g_startTime) must be bigger than 0 - AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert - FRAMEWORKUNIFIEDLOG (ZONE_WARN, __FUNCTION__, "[CpuHighLoad] Timer abnormality."); - endTime = g_startTime + 1; - // LCOV_EXCL_STOP - } - if (loadType == FIFO_TASK_SHOW) { // LCOV_EXCL_BR_LINE 200: loadType can't be FIFO_TASK_SHOW - // LCOV_EXCL_START 200: loadType can't be FIFO_TASK_SHOW - AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert - strcpy(loadPath,g_fifo_path); - beforeUtime = g_fifo_utime; - beforeStime = g_fifo_stime; - // LCOV_EXCL_STOP - } else { - strcpy(loadPath,g_tss_path); - beforeUtime = g_tss_utime; - beforeStime = g_tss_stime; - } - if (strlen(loadPath) > 0) { - ret = get_task_stat(loadPath, &tstat); - if (ret >= 0) { - dtime = (((tstat.utime + tstat.stime) - (beforeUtime + beforeStime)) * 1000) / (endTime - g_startTime); - if (tstat.task_policy == SCHED_FIFO) { - g_fifo_task_occ = dtime; - g_fifo_utime = tstat.utime; - g_fifo_stime = tstat.stime; - } else { - g_tss_task_occ = dtime; - g_tss_utime = tstat.utime; - g_tss_stime = tstat.stime; - } - } - } -} - - - -//void logging_cpuload_custom(void) { -// struct timespec req = { 1, 0 }; // 1sec -// -// cleanup_task_stat(); -// get_current_task_stat(); -// -// nanosleep(&req, NULL); -// -// show_cpuload(); -//} -unsigned long -logging_cpuload_custom(int32_t tmode) { - int32_t res = 0; - if (tmode == CPU_TASK_INIT) { - g_fifo_task_pid = -1; - g_tss_task_pid = -1; - g_fifo_task_occ = 0; - g_tss_task_occ = 0; - g_fifo_utime = 0; - g_fifo_stime = 0; - g_tss_utime = 0; - g_tss_stime = 0; - memset(g_fifo_path, 0x00, sizeof(g_fifo_path)); - memset(g_tss_path, 0x00, sizeof(g_tss_path)); - cleanup_task_stat(); - get_current_task_stat(); - } else if (tmode == CPU_TASK_SHOW_BF) { - cleanup_task_stat(); - get_current_task_stat(); - } else if (tmode == CPU_TASK_SHOW_AF) { - show_cpuload(); - } else if (tmode == FIFO_TASK_SHOW) { // LCOV_EXCL_BR_LINE 200: tmode can't be FIFO_TASK_SHOW - // LCOV_EXCL_START 200: tmode can't be FIFO_TASK_SHOW - AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert - show_cpuload_onetask(FIFO_TASK_SHOW); - // LCOV_EXCL_STOP - } else if (tmode == TSS_TASK_SHOW) { - show_cpuload_onetask(TSS_TASK_SHOW); - } else if (tmode == CPU_FIFO_TASK_GET_ID) { - res = g_fifo_task_pid; - g_fifo_show_timer = 0; - } else if (tmode == CPU_TSS_TASK_GET_ID) { - res = g_tss_task_pid; - g_tss_show_timer = 0; - } else if (tmode == CPU_FIFO_TASK_GET_OCCUPANCY) { - g_fifo_show_timer = g_fifo_show_timer + WTC_CPU_INTERVAL; - res = g_fifo_task_occ; - g_fifo_task_occ = 0; - } else if (tmode == CPU_TSS_TASK_GET_OCCUPANCY) { // LCOV_EXCL_BR_LINE 200: tmode can't be other value - g_tss_show_timer = g_tss_show_timer + WTC_CPU_INTERVAL; - res = g_tss_task_occ; - g_tss_task_occ = 0; - } - return res; -} - |