Rumah pembangunan bahagian belakang tutorial php php过载后无法恢复的原因分析_PHP教程

php过载后无法恢复的原因分析_PHP教程

Jul 14, 2016 am 10:08 AM
php Muncul Analisis punca belakang pulih bekalan Hidangkan mesin daripada kerap

最近php机器频繁出现过载后再也无法提供服务的现象,只要一有请求发过去,负责处理该请求的php进程就是cpu占用100%。本来的负载均衡策略是一旦某机器的php请求出现连接超时就将该机器的权重降低,发向该机器的请求概率就会降低,虽然有一定滞后效应,但是最终应该能够降压并且最后恢复服务,但是这个策略在最近突然失效了。出现这个情况之后无法发送什么请求到php-fpm都会cpu100%,即使请求的是一个空的php文件。于是猜想可能是eaccelerator造成的。

 
我们的Php-fpm的request_terminate_timeout设置的是5s,于是只要是有请求执行超过5s就会被php-fpm将执行进程干掉,在出问题的前后出现了大量的5s超时,初步猜想可能是因为eaccelerator的共享内存造成的,子进程被干掉时共享内存被写错了,导致所有请求过来都会出错,但是这解释不了新文件也会被卡住的问题,于是去看eacceleraotr的代码,发现如下代码
 
[cpp]  
#define spinlock_try_lock(rw)  asm volatile("lock ; decl %0" :"=m" ((rw)->lock) : : "memory")  
#define _spinlock_unlock(rw)   asm volatile("lock ; incl %0" :"=m" ((rw)->lock) : : "memory")  
  
static int mm_do_lock(mm_mutex* lock, int kind)   
{  
    while (1) {  
        spinlock_try_lock(lock);  
        if (lock->lock == 0) {   
            lock->pid = getpid();  
            lock->locked = 1;   
            return 1;  
        }      
        _spinlock_unlock(lock);  
        sched_yield();  
    }      
    return 1;  
}  
  
static int mm_do_unlock(mm_mutex* lock) {  
    if (lock->locked && (lock->pid == getpid())) {  
        lock->pid = 0;  
        lock->locked = 0;  
        _spinlock_unlock(lock);  
    }  
    return 1;  
}  
[cpp] 
  
其中mm_mutex是指向共享内存的,也就是说eac用了共享内存来当作进程间的锁,并且使用的spinlock方式,那这样一来一切都能解释的通了。设想如下一种情况,某个进程拿到锁之后被php-fpm干掉了,它没有unlock,这样一来所有的php-fpm子进程都拿不到锁,于是大家就都在这个while(1)循环里卡死了。猜想有了,怎么去证实呢?原来的想法是直接去读那片共享内存,结果发现php时IPC_PRIVATE的,所以没办法读了。于是只能等到线上出问题后gdb上去看内存,今天终于有了确凿的证据
[html]  
(gdb) p *mm->lock  
$8 = {lock = 4294966693, pid = 21775, locked = 1}  
这里可以看到内存已经被进程号为21775的进程拿到了,但事实是,这个进程在很早以前就已经被干掉了。
问题得到证实了,那么再回头看一下这个问题发生的条件
1、请求执行时间很长,长到会被php-fpm干掉
2、进程被干掉时,php正在require文件,并且eac拿到了锁
 
从这里可以看到,有一些特定情形会将这个概率放大
1、request_terminate_timeout时间很短
2、使用auoload方式,或者在执行逻辑里require文件,因为如果在请求开始前就将所有的文件加载,那除非光require文件就已经超时,否则不应该会在require文件时被干掉。但是同样的使用autload方式也有一个比较丑陋的办法可以避过这个问题,那就是在autload函数里判断一下,如果执行时间过长了就直接exit而不是require
 
个人觉得,解决这个问题的最好办法是request_terminate_timeout时间设置的足够长,比如30s, 300s,而将超时判断全部放在应用层,不能通过php-fpm来处理这种问题,php-fpm事实只能用作最后一重保险,不得不使用的保险。另外php里还有一个超时设置max_execution_time,但是这个超时在cgi模式下是cpu时间,所以作用不大
 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477815.htmlTechArticle最近php机器频繁出现过载后再也无法提供服务的现象,只要一有请求发过去,负责处理该请求的php进程就是cpu占用100%。本来的负载均衡策略...
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Konfigurasi Projek CakePHP Konfigurasi Projek CakePHP Sep 10, 2024 pm 05:25 PM

Dalam bab ini, kita akan memahami Pembolehubah Persekitaran, Konfigurasi Umum, Konfigurasi Pangkalan Data dan Konfigurasi E-mel dalam CakePHP.

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Penghalaan CakePHP Penghalaan CakePHP Sep 10, 2024 pm 05:25 PM

Dalam bab ini, kita akan mempelajari topik berikut yang berkaitan dengan penghalaan ?

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Pengesah Mencipta CakePHP Pengesah Mencipta CakePHP Sep 10, 2024 pm 05:26 PM

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

See all articles