Skip to content

Commit 1fe43d0

Browse files
committed
Add oom, wasted, hash and manual restart counters to help identify potential configuration problems
1 parent ccf7d7c commit 1fe43d0

File tree

4 files changed

+52
-14
lines changed

4 files changed

+52
-14
lines changed

ext/opcache/ZendAccelerator.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,7 @@ static void zend_accel_schedule_restart_if_necessary(TSRMLS_D)
852852
{
853853
if ((((double) ZSMMG(wasted_shared_memory)) / ZCG(accel_directives).memory_consumption) >= ZCG(accel_directives).max_wasted_percentage) {
854854
ZSMMG(memory_exhausted) = 1;
855-
zend_accel_schedule_restart(TSRMLS_C);
855+
zend_accel_schedule_restart(ACCEL_RESTART_WASTED TSRMLS_CC);
856856
}
857857
}
858858

@@ -1030,7 +1030,7 @@ static void zend_accel_add_key(char *key, unsigned int key_length, zend_accel_ha
10301030
if (zend_accel_hash_is_full(&ZCSG(hash))) {
10311031
zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!");
10321032
ZSMMG(memory_exhausted) = 1;
1033-
zend_accel_schedule_restart(TSRMLS_C);
1033+
zend_accel_schedule_restart(ACCEL_RESTART_HASH TSRMLS_CC);
10341034
} else {
10351035
char *new_key = zend_shared_alloc(key_length + 1);
10361036
if (new_key) {
@@ -1057,7 +1057,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
10571057
if (zend_accel_hash_is_full(&ZCSG(hash))) {
10581058
zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!");
10591059
ZSMMG(memory_exhausted) = 1;
1060-
zend_accel_schedule_restart(TSRMLS_C);
1060+
zend_accel_schedule_restart(ACCEL_RESTART_HASH TSRMLS_CC);
10611061
zend_shared_alloc_unlock(TSRMLS_C);
10621062
return new_persistent_script;
10631063
}
@@ -1118,7 +1118,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
11181118
if (!zend_accel_hash_update(&ZCSG(hash), key, key_length + 1, 1, bucket)) {
11191119
zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!");
11201120
ZSMMG(memory_exhausted) = 1;
1121-
zend_accel_schedule_restart(TSRMLS_C);
1121+
zend_accel_schedule_restart(ACCEL_RESTART_HASH TSRMLS_CC);
11221122
}
11231123
}
11241124

@@ -1500,7 +1500,7 @@ static zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int
15001500
ZCSG(misses)++;
15011501

15021502
/* No memory left. Behave like without the Accelerator */
1503-
if (ZSMMG(memory_exhausted)) {
1503+
if (ZSMMG(memory_exhausted) || ZCSG(restart_pending)) {
15041504
SHM_PROTECT();
15051505
return accelerator_orig_compile_file(file_handle, type TSRMLS_CC);
15061506
}
@@ -1964,6 +1964,20 @@ static void accel_activate(void)
19641964
if (accel_is_inactive(TSRMLS_C) == SUCCESS) {
19651965
zend_accel_error(ACCEL_LOG_DEBUG, "Restarting!");
19661966
ZCSG(restart_pending) = 0;
1967+
switch ZCSG(restart_reason) {
1968+
case ACCEL_RESTART_OOM:
1969+
ZCSG(oom_restarts)++;
1970+
break;
1971+
case ACCEL_RESTART_WASTED:
1972+
ZCSG(wasted_restarts)++;
1973+
break;
1974+
case ACCEL_RESTART_HASH:
1975+
ZCSG(hash_restarts)++;
1976+
break;
1977+
case ACCEL_RESTART_USER:
1978+
ZCSG(manual_restarts)++;
1979+
break;
1980+
}
19671981
accel_restart_enter(TSRMLS_C);
19681982

19691983
zend_reset_cache_vars(TSRMLS_C);
@@ -2322,8 +2336,13 @@ static void zend_accel_init_shm(TSRMLS_D)
23222336

23232337
zend_reset_cache_vars(TSRMLS_C);
23242338

2339+
ZCSG(oom_restarts) = 0;
2340+
ZCSG(wasted_restarts) = 0;
2341+
ZCSG(hash_restarts) = 0;
2342+
ZCSG(manual_restarts) = 0;
2343+
23252344
ZCSG(accelerator_enabled) = 1;
2326-
ZCSG(last_restart_time) = 0;
2345+
ZCSG(last_restart_time) = zend_accel_get_time();
23272346
ZCSG(restart_in_progress) = 0;
23282347

23292348
zend_shared_alloc_unlock(TSRMLS_C);
@@ -2547,7 +2566,7 @@ static void accel_shutdown(zend_extension *extension)
25472566

25482567
}
25492568

2550-
void zend_accel_schedule_restart(TSRMLS_D)
2569+
void zend_accel_schedule_restart(zend_accel_restart_reason reason TSRMLS_DC)
25512570
{
25522571
if (ZCSG(restart_pending)) {
25532572
/* don't schedule twice */
@@ -2556,6 +2575,7 @@ void zend_accel_schedule_restart(TSRMLS_D)
25562575
zend_accel_error(ACCEL_LOG_DEBUG, "Restart Scheduled!");
25572576

25582577
ZCSG(restart_pending) = 1;
2578+
ZCSG(restart_reason) = reason;
25592579
ZCSG(cache_status_before_restart) = ZCSG(accelerator_enabled);
25602580
ZCSG(accelerator_enabled) = 0;
25612581

ext/opcache/ZendAccelerator.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,13 @@ typedef unsigned __int64 accel_time_t;
164164
typedef time_t accel_time_t;
165165
#endif
166166

167+
typedef enum _zend_accel_restart_reason {
168+
ACCEL_RESTART_OOM, /* restart because of out of memory */
169+
ACCEL_RESTART_WASTED, /* restart because of wasted memory */
170+
ACCEL_RESTART_HASH, /* restart because of hash overflow */
171+
ACCEL_RESTART_USER /* restart sheduled by opcache_reset() */
172+
} zend_accel_restart_reason;
173+
167174
typedef struct _zend_persistent_script {
168175
ulong hash_value;
169176
char *full_path; /* full real path with resolved symlinks */
@@ -259,6 +266,10 @@ typedef struct _zend_accel_shared_globals {
259266
unsigned long hits;
260267
unsigned long misses;
261268
unsigned long blacklist_misses;
269+
unsigned long oom_restarts; /* number of restarts because of out of memory */
270+
unsigned long wasted_restarts; /* number of restarts because of wasted memory */
271+
unsigned long hash_restarts; /* number of restarts because of hash overflow */
272+
unsigned long manual_restarts; /* number of restarts sheduled by opcache_reset() */
262273
zend_accel_hash hash; /* hash table for cached scripts */
263274
zend_accel_hash include_paths; /* used "include_path" values */
264275

@@ -267,6 +278,7 @@ typedef struct _zend_accel_shared_globals {
267278
time_t force_restart_time;
268279
zend_bool accelerator_enabled;
269280
zend_bool restart_pending;
281+
zend_accel_restart_reason restart_reason;
270282
zend_bool cache_status_before_restart;
271283
#ifdef ZEND_WIN32
272284
unsigned long mem_usage;
@@ -304,7 +316,7 @@ extern zend_accel_globals accel_globals;
304316

305317
extern char *zps_api_failure_reason;
306318

307-
void zend_accel_schedule_restart(TSRMLS_D);
319+
void zend_accel_schedule_restart(zend_accel_restart_reason reason TSRMLS_DC);
308320
int accelerator_shm_read_lock(TSRMLS_D);
309321
void accelerator_shm_read_unlock(TSRMLS_D);
310322

ext/opcache/zend_accelerator_module.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ void zend_accel_info(ZEND_MODULE_INFO_FUNC_ARGS)
342342
{
343343
php_info_print_table_start();
344344

345-
if (ZCG(enabled) && accel_startup_ok && ZCSG(accelerator_enabled)) {
345+
if (ZCG(enabled) && accel_startup_ok && (ZCG(counted) || ZCSG(accelerator_enabled))) {
346346
php_info_print_table_row(2, "Opcode Caching", "Up and Running");
347347
} else {
348348
php_info_print_table_row(2, "Opcode Caching", "Disabled");
@@ -452,8 +452,10 @@ static ZEND_FUNCTION(opcache_get_status)
452452
array_init(return_value);
453453

454454
/* Trivia */
455-
add_assoc_bool(return_value, "opcache_enabled", ZCG(enabled) && ZCSG(accelerator_enabled));
455+
add_assoc_bool(return_value, "opcache_enabled", ZCG(enabled) && (ZCG(counted) || ZCSG(accelerator_enabled)));
456456
add_assoc_bool(return_value, "cache_full", ZSMMG(memory_exhausted));
457+
add_assoc_bool(return_value, "restart_pending", ZCSG(restart_pending));
458+
add_assoc_bool(return_value, "restart_in_progress", ZCSG(restart_in_progress));
457459

458460
/* Memory usage statistics */
459461
MAKE_STD_ZVAL(memory_usage);
@@ -472,6 +474,10 @@ static ZEND_FUNCTION(opcache_get_status)
472474
add_assoc_long(statistics, "max_cached_keys", ZCSG(hash).max_num_entries);
473475
add_assoc_long(statistics, "hits", ZCSG(hits));
474476
add_assoc_long(statistics, "last_restart_time", ZCSG(last_restart_time));
477+
add_assoc_long(statistics, "oom_restarts", ZCSG(oom_restarts));
478+
add_assoc_long(statistics, "wasted_restarts", ZCSG(wasted_restarts));
479+
add_assoc_long(statistics, "hash_restarts", ZCSG(hash_restarts));
480+
add_assoc_long(statistics, "manual_restarts", ZCSG(manual_restarts));
475481
add_assoc_long(statistics, "misses", ZSMMG(memory_exhausted)?ZCSG(misses):ZCSG(misses)-ZCSG(blacklist_misses));
476482
add_assoc_long(statistics, "blacklist_misses", ZCSG(blacklist_misses));
477483
reqs = ZCSG(hits)+ZCSG(misses);
@@ -561,7 +567,7 @@ static ZEND_FUNCTION(opcache_get_configuration)
561567
}
562568

563569
/* {{{ proto void accelerator_reset()
564-
Request that the contents of the Accelerator module in the ZPS be reset */
570+
Request that the contents of the opcode cache to be reset */
565571
static ZEND_FUNCTION(opcache_reset)
566572
{
567573
/* keep the compiler happy */
@@ -577,6 +583,6 @@ static ZEND_FUNCTION(opcache_reset)
577583
RETURN_FALSE;
578584
}
579585

580-
zend_accel_schedule_restart(TSRMLS_C);
586+
zend_accel_schedule_restart(ACCEL_RESTART_USER TSRMLS_CC);
581587
RETURN_TRUE;
582588
}

ext/opcache/zend_shared_alloc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,8 @@ static size_t zend_shared_alloc_get_largest_free_block(void)
276276
#define SHARED_ALLOC_FAILED() do { \
277277
zend_accel_error(ACCEL_LOG_WARNING, "Not enough free shared space to allocate %ld bytes (%ld bytes free)", (long)size, (long)ZSMMG(shared_free)); \
278278
if (zend_shared_alloc_get_largest_free_block() < MIN_FREE_MEMORY) { \
279-
ZSMMG(memory_exhausted) = 1; \
280-
zend_accel_schedule_restart(TSRMLS_C); \
279+
ZSMMG(memory_exhausted) = 1; \
280+
zend_accel_schedule_restart(ACCEL_RESTART_OOM TSRMLS_CC); \
281281
} \
282282
} while (0)
283283

0 commit comments

Comments
 (0)