用Sysctl 調整Linux作業系統的效能

來源:互聯網
上載者:User

Sysctl是一個允許您改變正在運行中的Linux系統的介面。它包含一些 TCP/IP 堆棧和虛擬記憶體系統的進階選項, 這可以讓有經驗的管理員提高令人信服的系統效能。用sysctl可以讀取設定超過五百個系統變數。基於這點,sysctl(8) 提供兩個功能:讀取和修改系統設定。

查看所有可讀變數:

% sysctl -a

讀一個指定的變數,例如 kern.maxproc:

% sysctl kern.maxproc kern.maxproc: 1044

要設定一個指定的變數,直接用 variable=value 這樣的文法:

# sysctl kern.maxfiles=5000

kern.maxfiles: 2088 –> 5000

sysctl -w

-w     Use this option when you want to change a sysctl setting.

注意,這個參數是用來改變當前值即虛擬檔案系統/proc下的值.

sysctl -p

-p     Load  in  sysctl settings from the file specified or /etc/sysctl.conf if none given.  Specifying - as filename means reading data from standard input.

注: 指定要載入的設定檔並顯示參數.如果不指定負載檔案的路徑,預設為:/etc/sysctl.conf

比如,如果你添加了某個參數到/etc/sysctl.conf,

echo "net.ipv4.tcp_keepalive_time=20">>/etc/sysctl.conf

那麼運行sysctl -p將重新載入設定檔,這樣新增加到設定檔的參數便能及時生效了.並且還會顯示所有該設定檔中的參數.

您可以使用sysctl修改系統變數,也可以通過編輯sysctl.conf檔案來修改系統變數。sysctl.conf 看起來很像 rc.conf。它用 variable=value 的形式來設定值。指定的值在系統進入多使用者模式之後被設定。並不是所有的變數都可以在這個模式下設定。

sysctl 變數的設定通常是字串、數字或者布爾型。 (布爾型用 1 來表示'yes',用 0 來表示'no')。

      ###############################

net.inet.ip.sourceroute=0

net.inet.ip.accept_sourceroute=0

#############################

通過源路由,攻擊者可以嘗試到達內部IP地址 --包括RFC1918中的地址,所以

不接受源路由資訊包可以防止你的內部網路被探測。

#################################

net.inet.tcp.drop_synfin=1

###################################

安全參數,編譯核心的時候加了options TCP_DROP_SYNFIN才可以用,可以阻止某些OS探測。

##################################

kern.maxvnodes=8446

vnode 是對檔案或目錄的一種內部表達。 因此, 增加可以被作業系統利用的 vnode 數量將降低磁碟的 I/O。

一般而言, 這是由作業系統自行完成的,也不需要加以修改。但在某些時候磁碟 I/O 會成為瓶頸,

而系統的 vnode 不足, 則這一配置應被增加。此時需要考慮是非活躍和空閑記憶體的數量。

要查看當前在用的 vnode 數量:

# sysctl vfs.numvnodes

vfs.numvnodes: 91349

要查看最大可用的 vnode 數量:

# sysctl kern.maxvnodes

kern.maxvnodes: 100000

如果當前的 vnode 用量接近最大值,則將 kern.maxvnodes 值增大 1,000 可能是個好主意。

您應繼續查看 vfs.numvnodes 的數值, 如果它再次攀升到接近最大值的程度,

仍需繼續提高 kern.maxvnodes。 在 top(1) 中顯示的記憶體用量應有顯著變化,

更多記憶體會處於活躍 (active) 狀態。

####################################

kern.maxproc: 964

Maximum number of processes

####################################

kern.maxprocperuid: 867

Maximum processes allowed per userid

####################################

因為我的maxusers設定的是256,20+16*maxusers=4116。

maxprocperuid至少要比maxproc少1,因為init(8) 這個系統程式絕對要保持在運作狀態。

我給它設定的2068。

kern.maxfiles: 1928

系統中支援最多同時開啟的檔案數量,如果你在運行資料庫或大的很吃描述符的進程,那麼應該設定在20000以上,

比如kde這樣的案頭環境,它同時要用的檔案非常多。

一般推薦設定為32768或者65536。

####################################

kern.argmax: 262144

  maximum number of bytes (or characters) in an argument list.

命令列下最多支援的參數,比如你在用find命令來大量刪除一些檔案的時候

find . -name "*.old" -delete,如果檔案數超過了這個數字,那麼會提示你數字太多的。

可以利用find . -name "*.old" -ok rm {} ;來刪除。

預設的參數已經足夠多了,因此不建議再做修改。

####################################

kern.securelevel: -1

  -1:這是系統預設層級,沒有提供任何核心的保護錯誤;

0:基本上作用不多,當你的系統剛啟動就是0層級的,當進入多使用者模式的時候就自動變成1級了。

1:在這個層級上,有如下幾個限制:

a. 不能通過kldload或者kldunload載入或者卸載可載入核心模組;

b. 應用程式不能通過/dev/mem或者/dev/kmem直接寫記憶體;

c. 不能直接往已經裝在(mounted)的磁碟寫東西,也就是不能格式化磁碟,但是可以通過標準的核心介面執行寫操作;

d. 不能啟動X-windows,同時不能使用chflags來修改檔案屬性;

2:在 1 層級的基礎上還不能寫沒裝載的磁碟,而且不能在1秒之內製造多次警告,這個是防止DoS控制台的;

3:在 2 層級的層級上不允許修改IPFW防火牆的規則。

如果你已經裝了防火牆,並且把規則設好了,不輕易改動,那麼建議使用3層級,如果你沒有裝防火牆,而且還準備裝防火牆的話,不建議使用。

我們這裡推薦使用 2 層級,能夠避免比較多對核心攻擊。

     ####################################

kern.maxfilesperproc: 1735

每個進程能夠同時開啟的最大檔案數量,網上很多資料寫的是32768

除非用非同步I/O或大量線程,開啟這麼多的檔案恐怕是不太正常的。

我個人建議不做修改,保留預設。

####################################

kern.ipc.maxsockbuf: 262144

最大的通訊端緩衝區,網上有建議設定為2097152(2M)、8388608(8M)的。

我個人倒是建議不做修改,保持預設的256K即可,緩衝區大了可能造成片段、阻塞或者丟包。

####################################

kern.ipc.somaxconn: 128

最大的等待串連完成的通訊端隊列大小,即並發串連數。

高負載伺服器和受到Dos攻擊的系統也許會因為這個隊列被塞滿而不能提供正常服務。

預設為128,推薦在1024-4096之間,根據機器和實際情況需要改動,數字越大佔用記憶體也越大。

####################################

kern.ipc.nmbclusters: 4800

這個值用來調整系統在開機後所要分配給網路 mbufs 的 cluster 數量,

由於每個 cluster 大小為 2K,所以當這個值為 1024 時,也是會用到 2MB 的核心記憶體空間。

假設我們的網頁同時約有 1000 個聯機,而 TCP 傳送及接收的暫存區大小都是 16K,

則最糟的情況下,我們會需要 (16K+16K) * 1024,也就是 32MB 的空間,

然而所需的 mbufs 大概是這個空間的二倍,也就是 64MB,所以所需的 cluster 數量為 64MB/2K,也就是 32768。

對於記憶體有限的機器,建議值是 1024 到 4096 之間,而當擁有海量儲存空間空間時,我們可以將它設定為 4096 到 32768 之間。

我們可以使用 netstat 這個指令並加上參數 -m 來查看目前所使用的 mbufs 數量。

要修改這個值必須在一開機就修改,所以只能在 /boot/loader.conf 中加入修改的設定

kern.ipc.nmbclusters=32768

####################################

kern.ipc.shmmax: 33554432

共用記憶體和號誌("System VIPC")如果這些過小的話,有些大型的軟體將無法啟動

安裝xine和mplayer提示的設定為67108864,即64M,

如果記憶體多的話,可以設定為134217728,即128M

####################################

kern.ipc.shmall: 8192

  共用記憶體和號誌("System VIPC")如果這些過小的話,有些大型的軟體將無法啟動

安裝xine和mplayer提示的設定為32768

####################################

kern.ipc.shm_use_phys: 0

如果我們將它設成 1,則所有 System V 共用記憶體 (share memory,一種程式間溝通的方式)部份都會被留在實體的記憶體 (physical memory) 中,

而不會被放到硬碟上的 swap 空間。我們知道實體記憶體的存取速度比硬碟快許多,而當實體記憶體空間不足時,

部份資料會被放到虛擬記憶體上,從實體記憶體和虛擬記憶體之間移轉的動作就叫作 swap。如果時常做 swap 的動作,

則需要一直對硬碟作 I/O,速度會很慢。因此,如果我們有大量的程式 (數百個) 需要共同分享一個小的共用記憶體空間,

或者是共用記憶體空間很大時,我們可以將這個值開啟。

這一項,我個人建議不做修改,除非你的記憶體非常大。

####################################

kern.ipc.shm_allow_removed: 0

共用記憶體是否允許移除?這項似乎是在fb下裝vmware需要設定為1的,否則會有載入SVGA出錯的提示

作為伺服器,這項不動也罷。

####################################

kern.ipc.numopensockets: 12

已經開啟的socket數目,可以在最繁忙的時候看看它是多少,然後就可以知道maxsockets應該設定成多少了。

####################################

kern.ipc.maxsockets: 1928

這是用來設定系統最大可以開啟的 socket 數目。如果您的伺服器會提供大量的 FTP 服務,

而且常快速的傳輸一些小檔案,您也許會發現常傳輸到一半就中斷。因為 FTP 在傳輸檔案時,

每一個檔案都必須開啟一個 socket 來傳輸,但關閉 socket 需要一段時間,如果傳輸速度很快,

而檔案又多,則同一時間所開啟的 socket 會超過原本系統所許可的值,這時我們就必須把這個值調大一點。

除了 FTP 外,也許有其它網路程式也會有這種問題。

然而,這個值必須在系統一開機就設定好,所以如果要修改這項設定,我們必須修改 /boot/loader.conf 才行

kern.ipc.maxsockets="16424"

####################################

kern.ipc.nsfbufs: 1456

經常使用 sendfile(2) 系統調用的繁忙的伺服器,

有必要通過 NSFBUFS 核心選項或者在 /boot/loader.conf (查看 loader(8) 以獲得更多細節) 中設定它的值來調節 sendfile(2) 緩衝數量。

這個參數需要調節的普通原因是在進程中看到 sfbufa 狀態。sysctl kern.ipc.nsfbufs 變數在核心組態變數中是唯讀。

這個參數是由 kern.maxusers 決定的,然而它可能有必要因此而調整。

在/boot/loader.conf裡加入

kern.ipc.nsfbufs="2496"

####################################

kern.maxusers: 59

maxusers 的值決定了處理常式所容許的最大值,20+16*maxusers 就是你將得到的所容許處理常式。

系統一開機就必須要有 18 個處理常式 (process),即便是簡單的執行指令 man 又會產生 9 個 process,

所以將這個值設為 64 應該是一個合理的數目。

如果你的系統會出現 proc table full 的訊息的話,可以就把它設大一點,例如 128。

除非您的系統會需要同時開啟很多檔案,否則請不要設定超過 256。

可以在 /boot/loader.conf 中加入該選項的設定,

kern.maxusers=256

####################################

kern.coredump: 1

如果設定為0,則程式異常退出時不會產生core檔案,作為伺服器,不建議這樣。

####################################

kern.corefile: %N.core

可設定為kern.corefile="/data/coredump/%U-%P-%N.core"

其中 %U是UID,%P是進程ID,%N是進程名,當然/data/coredump必須是一個實際存在的目錄

####################################

vm.swap_idle_enabled: 0

vm.swap_idle_threshold1: 2

vm.swap_idle_threshold2: 10

#########################

在有很多使用者進入、離開系統和有很多空閑進程的大的多使用者系統中很有用。

可以讓進程更快地進入記憶體,但它會吃掉更多的交換和磁碟頻寬。

系統預設的頁面調度演算法已經很好了,最好不要更改。

########################

vfs.ufs.dirhash_maxmem: 2097152

#########################

預設的dirhash最大記憶體,預設2M

增加它有助於改善單目錄超過100K個檔案時的反覆讀目錄時的效能

建議修改為33554432(32M)

#############################

vfs.vmiodirenable: 1

#################

這個變數控制目錄是否被系統緩衝。大多數目錄是小的,在系統中只使用單個片斷(典型的是1K)並且在緩衝中使用的更小 (典型的是512位元組)。

當這個變數設定為關閉 (0) 時,緩衝器僅僅緩衝固定數量的目錄,即使您有很大的記憶體。

而將其開啟 (設定為1) 時,則允許緩衝器用 VM 頁面緩衝來緩衝這些目錄,讓所有可用記憶體來緩衝目錄。

不利的是最小的用來緩衝目錄的核心記憶體是大於 512 位元組的物理頁面大小(通常是 4k)。

我們建議如果您在運行任何操作大量檔案的程式時保持這個選項開啟的預設值。

這些服務包括 web 緩衝,大容量郵件系統和新聞系統。

儘管可能會浪費一些記憶體,但開啟這個選項通常不會降低效能。但還是應該檢驗一下。

####################

vfs.hirunningspace: 1048576

############################

這個值決定了系統可以將多少資料放在寫入儲存裝置的等候區。通常使用預設值即可,

但當我們有多顆硬碟時,我們可以將它調大為 4MB 或 5MB。

注意這個設定成很高的值(超過緩衝器的寫極限)會導致壞的效能。

不要盲目的把它設定太高!高的數值會導致同時發生的讀操作的遲延。

#############################

vfs.write_behind: 1

#########################

這個選項預設為 1,也就是開啟的狀態。在開啟時,在系統需要寫入資料在硬碟或其它儲存裝置上時,

它會等到收集了一個 cluster 單位的資料後再一次寫入,否則會在一個暫存區空間有寫入需求時就立即寫到硬碟上。

這個選項開啟時,對於一個大的連續的檔案寫入速度非常有協助。但如果您遇到有很多行程延滯在等待寫入動作時,您可能必須關閉這個功能。

############################

net.local.stream.sendspace: 8192

##################################

本地通訊端串連的資料發送空間

建議設定為65536

###################################

net.local.stream.recvspace: 8192

##################################

本地通訊端串連的資料接收空間

建議設定為65536

###################################

net.inet.ip.portrange.lowfirst: 1023

net.inet.ip.portrange.lowlast: 600

net.inet.ip.portrange.first: 49152

net.inet.ip.portrange.last: 65535

net.inet.ip.portrange.hifirst: 49152

net.inet.ip.portrange.hilast: 65535

###################

以上六項是用來控制TCP及UDP所使用的port範圍,這個範圍被分成三個部份,低範圍、預設範圍、及高範圍。

這些是你的伺服器主動發起串連時的臨時連接埠的範圍,預設的已經1萬多了,一般的應用就足夠了。

如果是比較忙碌的FTP server,一般也不會同時提供給1萬多人訪問的,

當然如果很不幸,你的伺服器就要提供很多,那麼可以修改first的值,比如直接用1024開始

#########################

net.inet.ip.redirect: 1

#########################

設定為0,屏蔽ip重新導向功能

###########################

net.inet.ip.rtexpire: 3600

net.inet.ip.rtminexpire: 10

########################

很多apache產生的CLOSE_WAIT狀態,這種狀態是等待用戶端關閉,但是用戶端那邊並沒有正常的關閉,於是留下很多這樣的東東。

建議都修改為2

#########################

以上內容未經本站驗證,請在使用之前使用sysctl grep option對選項預設值進行尋找,對於命令無法搜尋到的選項請謹慎操作,可能導致無法啟動系統或者系統某些功能異常.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.