redis啟動流程(一)
閱讀思路
閱讀原始碼的時候應該抓住主幹,然後再去各個分支詳細分析(個人鄙見)。所以我個人認為redis的啟動流程應該是這套原始碼的主幹,所以我先從啟動流程下手。對於分析我大致講個原理,具體詳細註釋請參照我提交的註釋版redis,我在文章中就不再貼原始碼逐行解釋了。
從自己的知識積累出發,先自己預想了下,作為一個服務該有的啟動流程。
讀取配置->初始化引數->開始網路監聽->不斷處理網路任務
原始碼分析
首先查詢redis的main函式,不難查詢,我們在redis.c這個檔案中找到了main函式。
我們這裡列出main函式裡面主要的幾個函式,以下所列函式是按它們在main函式裡面的執行順序。(我們主要分析的是普通節點,哨兵節點的邏輯不在範圍內)
//--打散argv和environ所儲存內容的空間
spt_init(argc, argv);
//--主要在初始化全域性的server物件中的各個資料成員
initServerConfig();
//--繼續初始化全域性的server物件,並在裡面初始化了全域性的shared物件
//--監聽埠和uinx socket檔案
//--啟動bio執行緒
//--lua環境
initServer();
//--檢查系統的THP和overcommit_memory
linuxMemoryWarnings();
//--檢查tcp_backlog和系統的somaxconn引數值
checkTcpBacklogSettings();
//--根據RDB或者AOF檔案載入舊資料,優先AOF檔案
loadDataFromDisk();
//--進入事件迴圈處理
aeMain(server.el);
函式分析
spt_init()
redis一開始就把agrv所儲存的物件都打散開,是為了後面修改程式名字做鋪墊,那為什麼改個程式名要這 樣大費周折呢,那是因為agrv是連續儲存的。具體一些知識點我網上找了個資料可以參考下。
linuxMemoryWarnings()
redis啟動前檢測當前系統環境對於記憶體申請的策略,主要是檢查系統裡面的/proc/sys/vm/overcommit_memory的檔案內容,裡面的取值
0 -> 申請的虛擬記憶體大小大於現有的實體記憶體時,返回失敗
1 -> 忽視現有的實體記憶體,立即分配虛擬記憶體,當觸發缺頁而實體記憶體不足時可能會被oom程式殺死
2 -> 每次申請都根據現有的實體記憶體計算出一個閾值,然後跟這個閾值做比較來判斷是否允許本次申請
參考資料:http://blog.chinaunix.net/uid-20671208-id-4440244.html
當取到的值為0時,redis會打出警告資訊。
checkTcpBacklogSettings()
redis啟動前進行埠的監聽佇列的長度檢查,通過檢查系統的/proc/sys/net/core/somaxconn檔案的內容,對於監聽佇列的長度redis預設是511,由這個值REDIS_TCP_BACKLOG來定義。當取到的值小於server.tcp_backlog,redis會列印出警告資訊。
以上幾個函式我覺得有一些系統知識點的我羅列出來,具體邏輯還是要詳見文章開頭的原始碼,後面重點講講 initServer()和aeMain()這兩個函式,我認為是整個啟動流程的重點。
相關文章
- redis啟動流程(二)Redis
- Redis(一):服務啟動及基礎請求處理流程原始碼解析Redis原始碼
- nginx 框架學習(一)啟動流程Nginx框架
- redis啟動Redis
- redis系列(一)- 安裝與啟動Redis
- Flutter啟動流程Flutter
- AMS啟動流程
- App啟動流程APP
- Service啟動流程
- zygote啟動流程Go
- kernel 啟動流程
- flowable 啟動流程
- webx啟動流程Web
- SystemServer啟動流程Server
- IOC 啟動流程
- Android App應用啟動流程(一)AndroidAPP
- SpringBoot啟動流程分析原理(一)Spring Boot
- Android系統啟動流程(四)Launcher啟動過程與系統啟動流程Android
- 主流流程引擎 flowable 啟動流程
- Flutter 引擎啟動流程Flutter
- Activity啟動流程分析
- Laravel 的啟動流程Laravel
- Linux啟動流程Linux
- activity 啟動流程分析
- Unbound啟動流程分析
- SpringBoot原始碼解析-啟動流程(一)Spring Boot原始碼
- [深入SystemUI]-瞭解recents的啟動流程(一)SystemUI
- 一張圖理清ASP.NET Core啟動流程ASP.NET
- 如何啟動Redis ManagerRedis
- redis sentinel配置啟動Redis
- Redis初啟(一)Redis
- app啟動流程,activity啟動流程時序圖,binder相關資料APP時序圖
- 梳理一下Android 系統啟動流程Android
- Spring啟動流程(一)——準備重新整理Spring
- Android系統啟動流程(一)解析init程式Android
- 深入理解Activity啟動流程和AMS框架(一)框架
- Flutter之引擎啟動流程Flutter
- flutter 應用啟動流程Flutter