Crash with opcache_reset() under high load in fpm
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.1k
- Merge medio
- 2 d 13 h
- PR fusionados (30 d)
- 96
Descripción
Description
The following code:
<?php
class T {
}
new T;
opcache_reset();
Executed under php-fpm with the following fpm configuration (save this as custom.conf):
[global]
error_log = /dev/stderr
[www]
listen = 127.0.0.1:9000
pm = static
pm.max_children = 10
Ran using: valgrind ./php-fpm -F -y custom.conf with opcache enabled.
Put under load with: ab -c 24 -n 200000 http://localhost/index.php
Resulted in this output:
==150641== Process terminating with default action of signal 6 (SIGABRT)
==150641== at 0x4CCDE44: __pthread_kill_implementation (pthread_kill.c:44)
==150641== by 0x4C75A2F: raise (raise.c:26)
==150641== by 0x4C5D4C2: abort (abort.c:79)
==150641== by 0x4C5D3DE: __assert_fail_base.cold (assert.c:94)
==150641== by 0x4C6DC66: __assert_fail (assert.c:103)
==150641== by 0x702B6D: zend_gc_delref (zend_types.h:1228)
==150641== by 0x70317D: zend_string_release_ex (zend_string.h:332)
==150641== by 0x708F6E: _php_stream_open_wrapper_ex (streams.c:2291)
==150641== by 0x6E412B: php_stream_open_for_zend_ex (main.c:1564)
==150641== by 0x6E407E: php_stream_open_for_zend (main.c:1552)
==150641== by 0x7B538F9: persistent_stream_open_function (ZendAccelerator.c:2520)
==150641== by 0x8514F6: zend_stream_open (zend_stream.c:88)
And some similar crashes, also got one crash on time in zend_accelerator_util_funcs.c in ZSTR_SET_CE_CACHE_EX(ce->name, ce, 0);.
But I expected this output instead:
Obviously not that
PHP Version
8.2
Operating System
No response
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Reproduce el fallo con php-fpm, opcache, Valgrind y el comando de carga ab proporcionado. Empieza con los frames de la pila indicados en ZendAccelerator.c, zend_accelerator_util_funcs.c, streams.c y zend_types.h, y después sigue las rutas del fallo. Se considera terminado cuando la carga de trabajo ya no se aborta y produce la respuesta esperada.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- php
- Área
- backend, performance
- Tipo de issue
- Error
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100