天天看點

《建構高可用Linux伺服器 第3版》—— 2.4 系統維護時應該注意的地方

本節書摘來自華章出版社《建構高可用linux伺服器 第3版》一 書中的第2章,第2.4節,作者:餘洪春 ,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

無論是自己的内網開發機器還是線上的生産機器,我們在操作時都應該謹慎,否則系統很容易發生crash的情況。就算我們能用備份很快恢複,在恢複時間之内,我們也會損失大量的資料,而且如果萬一恢複不了,那就是災難性的了。

同僚在處理一台centos 5.8伺服器時,他在機器上移走了一塊硬碟,然後就直接啟動機器,忽然發現系統進了emergency模式,于是他連忙跑過來找我。我第一句就是問他:你改動了硬體沒?他說他移走硬碟後就直接啟動了,不是跟windows server 2003一樣嗎,有什麼問題?我跟他講解了一下linux系統下/etc/fatab的文法及作用,最後邊操作邊告訴他整個解決步驟,如下所示。

1)在emergency模式下輸入root密碼進入單使用者模式。

2)修改/etc/fstab檔案時會出現“read-only file system”,如何處理?重新将其裝載成讀寫模式,指令如下:

mount -o remount,rw /

這句話的作用是将/分區設定成可讀寫。

3)編輯/etc/fatab檔案,将移除的硬碟用#号屏蔽掉,然後重新開機伺服器,故障解除。

如果普通使用者用vim編輯nginx.conf等配置檔案,儲存的時候會提示:沒有root權限,解決辦法是在儲存時加上以下指令:

:w !sudo tee %

這條指令的含義是把目前編輯的檔案内容當做标準輸入并輸入到指令sudo tee檔案名裡去。也就是将sudo儲存為目前檔案名,這是一個相當管用的指令,不過這個指令比較拗口,我采用諧音記憶的方法記住了它,其實多練習幾次自然就熟悉此指令了。

在linux下部署應用(特别是squid伺服器時)的時候,有時會遇上“socket/file:cant open so many files”問題;這也會影響伺服器的最大并發數。其實linux是有檔案句柄限制的,而且linux預設不是很高,一般都是1024,如果是生産伺服器用,很容易就會達到這個數量。

1.檢視方法

我們可以用“ulimit-a”指令來檢視所有限制值,指令如下所示:

ulimit-a

指令顯示結果如下所示:

core file size     (blocks, -c) 0

data seg size      (kbytes, -d) unlimited

scheduling priority       (-e) 0

file size        (blocks, -f) unlimited

pending signals         (-i) 16126

max locked memory    (kbytes, -l) 32

max memory size     (kbytes, -m) unlimited

open files           (-n) 1024

pipe size      (512 bytes, -p) 8

posix message queues   (bytes, -q) 819200

real-time priority       (-r) 0

stack size       (kbytes, -s) 10240

cpu time        (seconds, -t) unlimited

max user processes       (-u) 16126

virtual memory     (kbytes, -v) unlimited

file locks           (-x) unlimited

其中open files(-n)1024是linux作業系統對一個程序打開的檔案句柄數量的限制(也包含打開的套接字數量,可影響mysql的并發連接配接數目)。這個值可用ulimit指令修改,但ulimit指令修改的數值隻對目前登入使用者目前使用的環境有效,系統重新開機或使用者退出後就會失效。

系統的總限制是在:/proc/sys/fs/file-max。我們可以通過cat指令檢視其目前的值,修改/etc/sysctl.conf也可以控制這個數值。

另外還有一個知識點,使用/proc/sys/fs/file-nr可以看到整個系統目前使用的檔案句柄數量。

查找檔案句柄問題的時候,還有一個很實用的程式lsof。可以很友善看到某個程序打開了哪些句柄,也可以看到某個檔案/目錄被什麼程序占用了。

2.修改方法

若要令修改ulimits的數值永久生效,則必須修改配置文檔,可以将ulimit修改指令放入/etc/profile裡面,不過,這個方法實在不友善。還有一個方法是修改/etc/sysctl.conf。我修改後測試過,發現它不會改變使用者的ulimits-a,隻改變/proc/sys/fs/file-max的值。

而我以前的做法是修改/etc/security/limits.conf,其中有很詳細的注釋,檔案内容修改如下所示:

繼續閱讀