|
11 | 11 | #include <string.h>
|
12 | 12 | #include <pthread.h>
|
13 | 13 | #include <sys/time.h>
|
| 14 | +#include <sys/resource.h> |
14 | 15 | #include <unistd.h>
|
15 | 16 | #include <stdbool.h>
|
16 | 17 | #include "backends/util.h"
|
@@ -1093,11 +1094,56 @@ static int RedisAI_RegisterApi(RedisModuleCtx* ctx) {
|
1093 | 1094 | void RAI_moduleInfoFunc(RedisModuleInfoCtx *ctx, int for_crash_report) {
|
1094 | 1095 | RedisModule_InfoAddSection(ctx, "git");
|
1095 | 1096 | RedisModule_InfoAddFieldCString(ctx, "git_sha", REDISAI_GIT_SHA);
|
1096 |
| - |
1097 | 1097 | RedisModule_InfoAddSection(ctx, "load_time_configs");
|
1098 | 1098 | RedisModule_InfoAddFieldLongLong(ctx, "threads_per_queue", perqueueThreadPoolSize);
|
1099 | 1099 | RedisModule_InfoAddFieldLongLong(ctx, "inter_op_parallelism", getBackendsInterOpParallelism());
|
1100 | 1100 | RedisModule_InfoAddFieldLongLong(ctx, "intra_op_parallelism", getBackendsIntraOpParallelism());
|
| 1101 | + struct rusage self_ru, c_ru; |
| 1102 | + // Return resource usage statistics for the calling process, |
| 1103 | + // which is the sum of resources used by all threads in the |
| 1104 | + // process |
| 1105 | + getrusage(RUSAGE_SELF, &self_ru); |
| 1106 | + // Return resource usage statistics for all of its |
| 1107 | + // terminated child processes |
| 1108 | + getrusage(RUSAGE_CHILDREN, &c_ru); |
| 1109 | + sds self_used_cpu_sys = sdscatprintf(sdsempty(),"%ld.%06ld",(long)self_ru.ru_stime.tv_sec,(long)self_ru.ru_stime.tv_usec); |
| 1110 | + sds self_used_cpu_user = sdscatprintf(sdsempty(),"%ld.%06ld",(long)self_ru.ru_utime.tv_sec, (long)self_ru.ru_utime.tv_usec); |
| 1111 | + sds children_used_cpu_sys = sdscatprintf(sdsempty(),"%ld.%06ld",(long)c_ru.ru_stime.tv_sec,(long)c_ru.ru_stime.tv_usec); |
| 1112 | + sds children_used_cpu_user = sdscatprintf(sdsempty(),"%ld.%06ld",(long)c_ru.ru_utime.tv_sec, (long)c_ru.ru_utime.tv_usec); |
| 1113 | + RedisModule_InfoAddSection(ctx, "cpu"); |
| 1114 | + RedisModule_InfoAddFieldCString(ctx, "self_used_cpu_sys", self_used_cpu_sys); |
| 1115 | + RedisModule_InfoAddFieldCString(ctx, "self_used_cpu_user", self_used_cpu_user); |
| 1116 | + RedisModule_InfoAddFieldCString(ctx, "children_used_cpu_sys", children_used_cpu_sys); |
| 1117 | + RedisModule_InfoAddFieldCString(ctx, "children_used_cpu_user", children_used_cpu_user); |
| 1118 | + |
| 1119 | + AI_dictIterator *iter = AI_dictGetSafeIterator(run_queues); |
| 1120 | + AI_dictEntry *entry = AI_dictNext(iter); |
| 1121 | + while (entry) { |
| 1122 | + char *queue_name = (char *)AI_dictGetKey(entry); |
| 1123 | + RunQueueInfo *run_queue_info = (RunQueueInfo *)AI_dictGetVal(entry); |
| 1124 | + if(run_queue_info){ |
| 1125 | + for (int i = 0; i < perqueueThreadPoolSize; i++) { |
| 1126 | + pthread_t current_bg_threads = run_queue_info->threads[i]; |
| 1127 | + struct timespec ts; |
| 1128 | + clockid_t cid; |
| 1129 | + sds queue_used_cpu_total = sdscatprintf(sdsempty(),"queue_%s_bthread_#%d_used_cpu_total",queue_name,i+1); |
| 1130 | + sds bthread_used_cpu_total = sdsempty(); |
| 1131 | + const int status = pthread_getcpuclockid(current_bg_threads,&cid); |
| 1132 | + if (status != 0){ |
| 1133 | + bthread_used_cpu_total = sdscatprintf(bthread_used_cpu_total,"N/A"); |
| 1134 | + } else { |
| 1135 | + if (clock_gettime(cid, &ts) == -1){ |
| 1136 | + bthread_used_cpu_total = sdscatprintf(bthread_used_cpu_total,"N/A"); |
| 1137 | + } else { |
| 1138 | + bthread_used_cpu_total = sdscatprintf(bthread_used_cpu_total,"%ld.%06ld",(long)ts.tv_sec, (long)(ts.tv_nsec / 1000000)); |
| 1139 | + } |
| 1140 | + } |
| 1141 | + RedisModule_InfoAddFieldCString(ctx, queue_used_cpu_total, bthread_used_cpu_total); |
| 1142 | + } |
| 1143 | + } |
| 1144 | + entry = AI_dictNext(iter); |
| 1145 | + } |
| 1146 | + AI_dictReleaseIterator(iter); |
1101 | 1147 | }
|
1102 | 1148 |
|
1103 | 1149 | int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
|
0 commit comments