LNMP架構下的程序模型分析

2021-09-11 10:09:00 字數 2158 閱讀 6129

如果已經在lnmp架構下工作2-3年時間,這個階段我們對自己常用的技術棧的工作原理一定需要有乙個基本的認識。一方面,可以去學習這些優秀軟體的設計思路,另一方面,可以為分析系統瓶頸和系統優化打好基礎。今天我們就來看看php-fpm/nginx/redis/mysql的程序模型。

php-fpm採用了master-worker多程序的模型,其次與php-cgi相比提供了更好的程序管理方式。php-fpm的程序模型示例圖如下:

master主程序的主要任務:

master通過如下的訊號來對程序進行管理:

sigint/sigterm 退出訊號

sigquit 優雅退出訊號

sigusr2 平滑重啟訊號

sigchld **子程序資源訊號(wait/waitpid防止異常退出的子程序變成殭屍程序,殭屍程序會占用pid等核心資源)

複製**

worker工作程序的主要任務:

多程序(單執行緒)併發模型

同樣,nginx也採用了master-worker多程序的模型,程序模型圖如下所示:

但是與php-fpm主要的不同的是:

master程序不負責監聽埠

worker程序自身監聽埠(多個程序會產生驚群效應,nginx使用互斥鎖使同一時刻只有乙個程序去listen埠)

master通過如下的訊號來對程序進行管理:

sigint/sigterm 退出訊號

sigquit 優雅退出訊號

sighup 平滑重啟訊號

sigusr2 平滑公升級訊號

sigwinch 優雅退出某個worker程序訊號

複製**

多程序(單執行緒)和多路i/o復用併發模型

redis採用的是單程序的模型,如下圖所示:

但是,redis需要實現持久化,持久化的方式一般有兩種rdb(寫快照)/aof(寫命令),持久化的過程redis會fork乙個子程序來完成,目的不阻塞master工作程序。如下圖所示:

單程序(單執行緒)和多路i/o復用併發模型

mysql談程序模型其實還是不合適,mysql主要採用的是多執行緒的架構。

多執行緒併發模型

php-fpm多程序,符合php語言的設計思想「簡單」。程序間資源隔離,簡單且複雜性底,反之相對於而言高流量下效能會不是很好。

nginx多程序,worker去監聽埠,一方面,使得master專注於程序管理;另一方面,提高服務的健壯性,如果有乙個worker掛了別的worker還可以繼續處理請求;其次,發揮計算機多核的優勢。

redis單程序,採用i/o多路復用效能已經足夠的好,redis基本都是記憶體操作,不使用多執行緒,避免了大量競爭,簡化了系統的複雜度。其次,redis也沒涉及複雜的計算場景,單核足夠使用。

mysql多執行緒,按照我目前的理解,絕大多數常用的mysql引擎的效能瓶頸是在於磁碟io,多執行緒技術已經足夠滿足併發需求。

從上面看來,不同的系統設計,根據它的運用場景都採用了符合它們自身需求的設計。比如,php的簡單;nginx的高可用高效能的web server;redis高效能的nosql;mysql大量的磁碟操作。

這些系統使用的多程序,多執行緒,協程,i/o多路復用(select/poll/epoll)等技術手段都是指引我們去優化我們系統的方向,這些優秀系統都為我們的設計思路提供了很好的案例,去提高併發能力,解決網路io、磁碟io問題。這些都是我們現在以及未來需要去理解和消化的東西。

常見linux訊號和數字對映表:

訊號數字(linux)

含義sigkill

9force kill

sigint

2interrupt

sigquit

3quit graceful

sigterm

15terminate

sighup

1hang up

sigusr1

10user defined

sigusr2

12user defined

Ubuntu 下搭建LNMP架構

ubuntu 14.04 lts 安裝 lnmp nginx php5 php fpm mysql nginx 安裝php5和mysql 資料庫 安裝 nginx 安裝php5 fpm 配置 nginx 配置 php 重啟服務 nginx 讀音 engine x 免費 開源 高效的 http 服務。...

swoole的程序模型架構

2014年5月5日 韓 天峰 swoole的強大之處就在與其程序模型的設計,既解決了非同步問題,又解決了並行。swoole啟動後主執行緒會負責監聽server socket,如果有新的連線accept,主線程會評估每個reactor執行緒的連線數量。將此連線分配給連線數最少的reactor執行緒。這...

swoole的程序模型架構

swoole的強大之處就在與其程序模型的設計,既解決了非同步問題,又解決了並行。swoole啟動後主執行緒會負責監聽server socket,如果有新的連線accept,主線程會評估每個reactor執行緒的連線數量。將此連線分配給連線數最少的reactor執行緒。這樣的好處是 每個reactor...