@@ -127,8 +127,8 @@ calculate_cpu_usage(int32 sleep_prev, int32 sleep_diff)
127
127
priority_sum = pg_atomic_read_u32 (& PriorityWorkerState -> cpu_priority_sum );
128
128
129
129
if (ru_spent_actual == 0 || spent_sum == 0 || priority_sum == 0 ||
130
- session_interrupt_count == 0 /* ||
131
- session_cpu_weight == pg_atomic_read_u32(&PriorityWorkerState->cpu_priority_max)*/ )
130
+ session_interrupt_count == 0 ||
131
+ session_cpu_weight == pg_atomic_read_u32 (& PriorityWorkerState -> cpu_priority_max ))
132
132
{
133
133
ru_spent_prev = 0 ;
134
134
return 0 ;
@@ -137,18 +137,19 @@ calculate_cpu_usage(int32 sleep_prev, int32 sleep_diff)
137
137
/* Calculate total time to sleep */
138
138
ru_spent_need = session_cpu_weight * spent_sum / priority_sum * 1.1 ;
139
139
140
- if (sleep_diff != 0 )
140
+ if (sleep_diff != 0 && ru_spent_actual != ru_spent_prev )
141
141
{
142
142
int64 ru_diff ,
143
+ ru_diff_need ,
143
144
impact ,
144
145
res ;
145
- float8 factor ;
146
146
147
147
ru_diff = (int64 ) ru_spent_actual - (int64 ) ru_spent_prev ;
148
148
if (ru_diff < 0 )
149
149
ru_diff *= -1 ;
150
- factor = (ru_diff != 0 ) ? (float8 ) (sleep_diff / ru_diff ) : 0 ;
151
- impact = (int ) ((int ) (ru_spent_actual - ru_spent_need ) * factor );
150
+
151
+ ru_diff_need = ru_spent_actual - ru_spent_need ;
152
+ impact = (int64 ) (ru_diff_need * sleep_diff / ru_diff );
152
153
153
154
res = sleep_prev + impact ;
154
155
if (res > PG_INT32_MAX || res < PG_INT32_MIN || res < 0 )
@@ -162,18 +163,15 @@ calculate_cpu_usage(int32 sleep_prev, int32 sleep_diff)
162
163
sleep_need = (ru_spent_actual > ru_spent_need ) ?
163
164
sleep_prev * 1.1 : sleep_prev * 0.9 ;
164
165
else
165
- {
166
166
sleep_need = (ru_spent_actual > ru_spent_need ) ?
167
- (ru_spent_actual - ru_spent_need ) : 0 ;
168
- elog (LOG , UINT64_FORMAT , ru_spent_actual - ru_spent_need );
169
- }
167
+ (int32 ) (ru_spent_actual - ru_spent_need ) : 0 ;
170
168
}
171
169
172
170
ru_spent_prev = ru_spent_actual ;
173
171
174
- elog (LOG , "- %d - cpu, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT ,
175
- session_cpu_weight , sleep_need , sleep_prev ,
176
- ru_spent_actual , ru_spent_need );
172
+ // elog(LOG, "- %d - cpu, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT,
173
+ // session_cpu_weight, sleep_need, sleep_prev,
174
+ // ru_spent_actual, ru_spent_need);
177
175
178
176
return sleep_need ;
179
177
}
@@ -220,19 +218,19 @@ calculate_ioread_usage(int32 sleep_prev, int32 sleep_diff)
220
218
/* Calculate total time to sleep */
221
219
blks_read_need = session_ioread_weight * read_sum / priority_sum * 1.1 ;
222
220
223
- if (sleep_diff != 0 )
221
+ if (sleep_diff != 0 && blks_read_actual != blks_read_prev )
224
222
{
225
223
int64 read_diff ,
224
+ read_diff_need ,
226
225
impact ,
227
226
res ;
228
- float8 factor ;
229
227
230
228
read_diff = (int64 ) blks_read_actual - (int64 ) blks_read_prev ;
231
229
if (read_diff < 0 )
232
230
read_diff *= -1 ;
233
- factor = (read_diff != 0 ) ? (float8 ) (sleep_diff / read_diff ) : 0 ;
234
231
235
- impact = (int ) ((int ) (blks_read_actual - blks_read_need ) * factor );
232
+ read_diff_need = blks_read_actual - blks_read_need ;
233
+ impact = (int64 ) (read_diff_need * sleep_diff / read_diff );
236
234
237
235
res = sleep_prev + impact ;
238
236
@@ -247,18 +245,15 @@ calculate_ioread_usage(int32 sleep_prev, int32 sleep_diff)
247
245
sleep_need = (blks_read_actual > blks_read_need ) ?
248
246
sleep_prev * 1.1 : sleep_prev * 0.9 ;
249
247
else
250
- {
251
248
sleep_need = (blks_read_actual > blks_read_need ) ?
252
- (blks_read_actual - blks_read_need ) / 30 : 0 ;
253
- elog (LOG , UINT64_FORMAT , blks_read_actual - blks_read_need );
254
- }
249
+ (int32 ) (blks_read_actual - blks_read_need ) / 30 : 0 ;
255
250
}
256
251
257
252
blks_read_prev = blks_read_actual ;
258
253
259
- elog (LOG , "- %d - ioread, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT ,
260
- session_ioread_weight , sleep_need , sleep_prev ,
261
- blks_read_actual , blks_read_need );
254
+ // elog(LOG, "- %d - ioread, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT,
255
+ // session_ioread_weight, sleep_need, sleep_prev,
256
+ // blks_read_actual, blks_read_need);
262
257
263
258
return sleep_need ;
264
259
}
@@ -305,19 +300,19 @@ calculate_iowrite_usage(int32 sleep_prev, int32 sleep_diff)
305
300
/* Calculate total time to sleep */
306
301
blks_write_need = session_iowrite_weight * write_sum / priority_sum * 1.1 ;
307
302
308
- if (sleep_diff != 0 )
303
+ if (sleep_diff != 0 && blks_write_actual != blks_write_prev )
309
304
{
310
305
int64 write_diff ,
306
+ write_diff_need ,
311
307
impact ,
312
308
res ;
313
- float8 factor ;
314
309
315
310
write_diff = (int64 ) blks_write_actual - (int64 ) blks_write_prev ;
316
311
if (write_diff < 0 )
317
312
write_diff *= -1 ;
318
- factor = (write_diff != 0 ) ? (float8 ) (sleep_diff / write_diff ) : 0 ;
319
313
320
- impact = (int ) ((int ) (blks_write_actual - blks_write_need ) * factor );
314
+ write_diff_need = blks_write_actual - blks_write_need ;
315
+ impact = (int64 ) (write_diff_need * sleep_diff / write_diff );
321
316
322
317
res = sleep_prev + impact ;
323
318
@@ -333,14 +328,14 @@ calculate_iowrite_usage(int32 sleep_prev, int32 sleep_diff)
333
328
sleep_prev * 1.1 : sleep_prev * 0.9 ;
334
329
else
335
330
sleep_need = (blks_write_actual > blks_write_need ) ?
336
- (blks_write_actual - blks_write_need ) / 30 : 0 ;
331
+ (int32 ) ( blks_write_actual - blks_write_need ) / 10 : 0 ;
337
332
}
338
333
339
334
blks_write_prev = blks_write_actual ;
340
335
341
- elog (LOG , "- %d - iowrite, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT ,
342
- session_iowrite_weight , sleep_need , sleep_prev ,
343
- blks_write_actual , blks_write_need );
336
+ // elog(LOG, "- %d - iowrite, %d, %d, " UINT64_FORMAT ", " UINT64_FORMAT,
337
+ // session_iowrite_weight, sleep_need, sleep_prev,
338
+ // blks_write_actual, blks_write_need);
344
339
345
340
return sleep_need ;
346
341
}
@@ -381,7 +376,7 @@ SessionUsageTimeoutHandler(void)
381
376
382
377
session_interrupt_count = 0 ;
383
378
384
- /* Re-enable timeout if priorities are enable */
379
+ /* Re-enable timeout if prioritization is enabled */
385
380
if (usage_tracking_interval && session_usage_timeout_enabled )
386
381
enable_timeout_after (SESSION_USAGE_TIMEOUT ,
387
382
usage_tracking_interval * 1000 );
0 commit comments