『壹』 一般優化linux的內核,需要優化什麼參數
方法只對擁有大量TIME_WAIT狀態的連接導致系統資源消耗有效,如果不是這種情況下,效果可能不明顯。可以使用netstat命令去查TIME_WAIT狀態的連接狀態,輸入下面的組合命令,查看當前TCP連接的狀態和對應的連接數量:
#netstat -n | awk 『/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}』
這個命令會輸出類似下面的結果:
LAST_ACK 16
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18098
我們只用關心TIME_WAIT的個數,在這里可以看到,有18000多個TIME_WAIT,這樣就佔用了18000多個埠。要知道埠的數量只有65535個,佔用一個少一個,會嚴重的影響到後繼的新連接。這種情況下,我們就有必要調整下Linux的TCP內核參數,讓系統更快的釋放TIME_WAIT連接。
用vim打開配置文件:#vim /etc/sysctl.conf
在這個文件中,加入下面的幾行內容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
輸入下面的命令,讓內核參數生效:#sysctl -p
簡單的說明上面的參數的含義:
net.ipv4.tcp_syncookies = 1
#表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1
#表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1
#表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉;
net.ipv4.tcp_fin_timeout
#修改系統默認的 TIMEOUT 時間。
在經過這樣的調整之後,除了會進一步提升伺服器的負載能力之外,還能夠防禦小流量程度的DoS、CC和SYN攻擊。
此外,如果你的連接數本身就很多,我們可以再優化一下TCP的可使用埠范圍,進一步提升伺服器的並發能力。依然是往上面的參數文件中,加入下面這些配置:
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
#這幾個參數,建議只在流量非常大的伺服器上開啟,會有顯著的效果。一般的流量小的伺服器上,沒有必要去設置這幾個參數。
net.ipv4.tcp_keepalive_time = 1200
#表示當keepalive起用的時候,TCP發送keepalive消息的頻度。預設是2小時,改為20分鍾。
net.ipv4.ip_local_port_range = 10000 65000
#表示用於向外連接的埠范圍。預設情況下很小:32768到61000,改為10000到65000。(注意:這里不要將最低值設的太低,否則可能會佔用掉正常的埠!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網路連接數。
net.ipv4.tcp_max_tw_buckets = 6000
#表示系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT將立刻被清除並列印警告信息。默 認為180000,改為6000。對於Apache、Nginx等伺服器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid,效果卻不大。此項參數可以控制TIME_WAIT的最大數量,避免Squid伺服器被大量的TIME_WAIT拖死。
內核其他TCP參數說明:
net.ipv4.tcp_max_syn_backlog = 65536
#記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有128M內存的系統而言,預設值是1024,小內存的系統則是128。
net.core.netdev_max_backlog = 32768
#每個網路介面接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
net.core.somaxconn = 32768
#web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認為511,所以有必要調整這個值。
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216 #最大socket讀buffer,可參考的優化值:873200
net.core.wmem_max = 16777216 #最大socket寫buffer,可參考的優化值:873200
net.ipv4.tcp_timestsmps = 0
#時間戳可以避免序列號的卷繞。一個1Gbps的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種「異常」的數據包。這里需要將其關掉。
net.ipv4.tcp_synack_retries = 2
#為了打開對端的連接,內核需要發送一個SYN並附帶一個回應前面一個SYN的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送SYN+ACK包的數量。
net.ipv4.tcp_syn_retries = 2
#在內核放棄建立連接之前發送SYN包的數量。
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
# 開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接。
net.ipv4.tcp_wmem = 8192 436600 873200
# TCP寫buffer,可參考的優化值: 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
# TCP讀buffer,可參考的優化值: 32768 436600 873200
net.ipv4.tcp_mem = 94500000 91500000 92700000
# 同樣有3個值,意思是:
net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力。
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段。
net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket。
上述內存單位是頁,而不是位元組。可參考的優化值是:786432 1048576 1572864
net.ipv4.tcp_max_orphans = 3276800
#系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。
如果超過這個數字,連接將即刻被復位並列印出警告信息。
這個限制僅僅是為了防止簡單的DoS攻擊,不能過分依靠它或者人為地減小這個值,
更應該增加這個值(如果增加了內存之後)。
net.ipv4.tcp_fin_timeout = 30
#如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。對端可以出錯並永遠不關閉連接,甚至意外當機。預設值是60秒。2.2 內核的通常值是180秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕載的WEB伺服器,也有因為大量的死套接字而內存溢出的風險,FIN- WAIT-2的危險性比FIN-WAIT-1要小,因為它最多隻能吃掉1.5K內存,但是它們的生存期長些。
深入學習linux看下《linux就該這么學》
『貳』 在linux 中, /sys 目錄是將內核的一些信息映射,可供應用程序所用,那麼/proc的作用與之有何區別呢
proc文件系統是一個偽文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式為訪問系統內核數據的操作提供介面。用戶和應用程序可以通過proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取proc文件時,proc文件系統是動態從系統內核讀出所需信息並提交的。
sysfs 與 proc 相比有很多優點,最重要的莫過於設計上的清晰。一個 proc 虛擬文件可能有內部格式,如 /proc/scsi/scsi ,它是可讀可寫的,(其文件許可權被錯誤地標記為了 0444 !,這是內核的一個BUG),並且讀寫格式不一樣,代表不同的操作,應用程序中讀到了這個文件的內容一般還需要進行字元串解析,而在寫入時需要先用字元串格式化按指定的格式寫入字元串進行操作;相比而言, sysfs 的設計原則是一個屬性文件只做一件事情, sysfs 屬性文件一般只有一個值,直接讀取或寫入。整個 /proc/scsi 目錄在2.6內核中已被標記為過時(LEGACY),它的功能已經被相應的 /sys 屬性文件所完全取代。新設計的內核機制應該盡量使用 sysfs 機制,而將 proc 保留給純凈的「進程文件系統」。
『叄』 虛擬文件系統的Linux虛擬文件系統簡介
1
引言
linux
中允許眾多不同的文件系統共存,如
ext2,
ext3,
vfat
等。通過使用同一套文件
i/o
系統
調用即可對
linux
中的任意文件進行操作而無需考慮其所在的具體文件系統格式;更進一步,對文件的
操作可以跨文件系統而執行。如圖
1
所示,我們可以使用
cp
命令從
vfat
文件系統格式的硬碟拷貝數據到
ext3
文件系統格式的硬碟;而這樣的操作涉及到兩個不同的文件系統。
圖
1.
跨文件系統的文件操作
「一切皆是文件」是
unix/linux
的基本哲學之一。不僅普通的文件,目錄、字元設備、塊設備、
套接字等在
unix/linux
中都是以文件被對待;它們雖然類型不同,但是對其提供的卻是同一套操作界面。
圖
2.
一切皆是文件
而虛擬文件系統正是實現上述兩點
linux
特性的關鍵所在。虛擬文件系統(virtual
file
system,
簡稱
vfs),
是
linux
內核中的一個軟體層,用於給用戶空間的程序提供文件系統介面;同時,它也提供了內核中的一個
抽象功能,允許不同的文件系統共存。系統中所有的文件系統不但依賴
vfs
共存,而且也依靠
vfs
協同工作。
為了能夠支持各種實際文件系統,vfs
定義了所有文件系統都支持的基本的、概念上的介面和數據
結構;同時實際文件系統也提供
vfs
所期望的抽象介面和數據結構,將自身的諸如文件、目錄等概念在形式
上與vfs的定義保持一致。換句話說,一個實際的文件系統想要被
linux
支持,就必須提供一個符合vfs標准
的介面,才能與
vfs
協同工作。實際文件系統在統一的介面和數據結構下隱藏了具體的實現細節,所以在vfs
層和內核的其他部分看來,所有文件系統都是相同的。圖3顯示了vfs在內核中與實際的文件系統的協同關系。
圖3.
vfs在內核中與其他的內核模塊的協同關系
我們已經知道,正是由於在內核中引入了vfs,跨文件系統的文件操作才能實現,「一切皆是文件」
的口號才能承諾。而為什麼引入了vfs,就能實現這兩個特性呢?在接下來,我們將以這樣的一個思路來切入
文章的正題:我們將先簡要介紹下用以描述vfs模型的一些數據結構,總結出這些數據結構相互間的關系;然後
選擇兩個具有代表性的文件i/o操作sys_open()和sys_read()來詳細說明內核是如何藉助vfs和具體的文件系統打
交道以實現跨文件系統的文件操作和承諾「一切皆是文件」的口號。
『肆』 Linux 的 df 命令查看硬碟信息後 /proc掛載點的容量是0,為什麼
在Linux中,/proc 是系統信息的虛擬目錄 (2.4 和 2.6 內核),這些信息是在內存中,由系統回自己產生的答,也就是說 /proc是系統進程的內存映射,沒有容量.所以顯示掛載點容量為0 .
補充一下: /proc沒掛載會導致各種/proc下文件打不開的.
『伍』 Linux 內核的內存管理 - 概念
Concepts overview — The Linux Kernel documentation
Linux中的內存管理是一個復雜的系統,經過多年的發展,它包含越來越多的功能,以支持從 MMU-less microcontrollers 到 supercomputers 的各種系統。
沒有MMU內存管理的系統被稱為 nommu ,它值得寫一份專門的文檔進行描述。
盡管有些概念是相同的,這里我們假設MMU可用,CPU可以將虛擬地址轉換為物理地址。
計算機系統中的物理內存是有限資源,即便支持內存熱插拔,其可以安裝的內存也有限的。物理內存不一定必須是連續的;它可以作為一組不同的地址范圍被訪問。此外,不同的CPU架構,甚至同架構的不同實現對如何定義這些地址范圍都是不同的。
這使得直接處理物理內存異常復雜,為了避免這種復雜性,開發了 虛擬內存 (virtual memory) 的概念。
虛擬內存從應用軟體中抽象出物理內存的細節,只允許在物理內存中保留需要的信息 (demand paging) ,並提供一種機制來保護和控制進程之間的數據共享。
通過虛擬內存,每次內存訪問都訪問一個 虛擬地址 。當CPU對從系統內存讀取(或寫入)的指令進行解碼時,它將該指令中編碼的虛擬地址轉換為內存控制器可以理解的物理地址。
物理內存被切分為 頁幀 page frames 或 頁 pages 。頁的大小是基於架構的。一些架構允許從幾個支持的值中選擇頁大小;此選擇在內核編譯時設置到內核配置。
每個物理內存頁都可以映射為一個或多個 虛擬頁(virtual pages) 。映射關系描述在 頁表(page tables) 中,頁表將程序使用的虛擬地址轉換為物理內存地址。頁表以層次結構組織。
最底層的表包含軟體使用的實際內存頁的物理地址。較高層的表包含較低層表頁的物理地址。頂層表的指針駐留在寄存器中。
當CPU進行地址轉換的時候,它使用寄存器訪問頂級頁表。
虛擬地址的高位,用於頂級頁表的條目索引。然後,通過該條目訪問下級,下級的虛擬地址位又作為其下下級頁表的索引。虛擬地址的最低位定義實際頁內的偏移量。
地址轉換需要多次內存訪問,而內存訪問相對於CPU速度來說比較慢。為了避免在地址轉換上花費寶貴的處理器周期,CPU維護著一個稱為 TLB (Translation Lookaside Buffer)的用於地址轉換緩存(cache)。通常TLB是非常稀缺的資源,需要大內存工作應用程序會因為TLB未命中而影響性能。
很多現代CPU架構允許頁表的高層直接映射到內存頁。例如,x86架構,可以通過二級、三級頁表的條目映射2M甚至1G內存頁。在Linux中,這些內存頁稱為 大頁 (Huge) 。大頁的使用顯著降低了TLB的壓力,提高了TLB命中率,從而提高了系統的整體性能。
Linux提供兩種機制開啟使用大頁映射物理內存。
第一個是 HugeTLB 文件系統,即 hugetlbfs 。它是一個偽文件系統,使用RAM作為其存儲。在此文件系統中創建的文件,數據駐留在內存中,並使用大頁進行映射。
關於 HugeTLB Pages
另一個被稱為 THP (Transparent HugePages) ,後出的開啟大頁映射物理內存的機制。
與 hugetlbfs 不同,hugetlbfs要求用戶和/或系統管理員配置系統內存的哪些部分應該並可以被大頁映射;THP透明地管理這些映射並獲取名稱。
關於 Transparent Hugepage Support
通常,硬體對不同物理內存范圍的訪問方式有所限制。某些情況下,設備不能對所有可定址內存執行DMA。在其他情況下,物理內存的大小超過虛擬內存的最大可定址大小,需要採取特殊措施來訪問部分內存。還有些情況,物理內存的尺寸超過了虛擬內存的最大可定址尺寸,需要採取特殊措施來訪問部分內存。
Linux根據內存頁的使用情況,將其組合為多個 zones 。比如, ZONE_DMA 包含設備用於DMA的內存, ZONE_HIGHMEM 包含未永久映射到內核地址空間的內存, ZONE_NORMAL 包含正常定址內存頁。
內存zones的實際層次架構取決於硬體,因為並非所有架構都定義了所有的zones,不同平台對DMA的要求也不同。
多處理器機器很多基於 NUMA (Non-Uniform Memory Access system - 非統一內存訪問系統 )架構。 在這樣的系統中,根據與處理器的「距離」,內存被安排成具有不同訪問延遲的 banks 。每個 bank 被稱為一個 node ,Linux為每個 node 構造一個獨立的內存管理子系統。 Node 有自己的zones集合、free&used頁面列表,以及各種統計計數器。
What is NUMA?
NUMA Memory Policy
物理內存易失,將數據放入內存的常見情況是讀取文件。讀取文件時,數據會放入 頁面緩存(page cache) ,可以在再次讀取時避免耗時的磁碟訪問。同樣,寫文件時,數據也會被放入 頁面緩存 ,並最終進入存儲設備。被寫入的頁被標記為 臟頁(dirty page) ,當Linux決定將其重用時,它會將更新的數據同步到設備上的文件。
匿名內存 anonymous memory 或 匿名映射 anonymous mappings 表示沒有後置文件系統的內存。這些映射是為程序的stack和heap隱式創建的,或調用mmap(2)顯式創建的。通常,匿名映射只定義允許程序訪問的虛擬內存區域。讀,會創建一個頁表條目,該條目引用一個填充有零的特殊物理頁。寫,則分配一個常規物理頁來保存寫入數據。該頁將被標記為臟頁,如果內核決定重用該頁,則臟頁將被交換出去 swapped out 。
縱貫整個系統生命周期,物理頁可用於存儲不同類型的數據。它可以是內核內部數據結構、設備驅動DMA緩沖區、讀取自文件系統的數據、用戶空間進程分配的內存等。
根據內存頁使用情況,Linux內存管理會區別處理。可以隨時釋放的頁面稱為 可回收(reclaimable) 頁面,因為它們把數據緩存到了其他地方(比如,硬碟),或者被swap out到硬碟上。
可回收頁最值得注意的是 頁面緩存 和 匿名頁面 。
在大多數情況下,存放內部內核數據的頁,和用作DMA緩沖區的頁無法重用,它們將保持現狀直到用戶釋放。這樣的被稱為 不可回收頁(unreclaimable) 。
然而,在特定情況下,即便是內核數據結構佔用的頁面也會被回收。
例如,文件系統元數據的緩存(in-memory)可以從存儲設備中重新讀取,因此,當系統存在內存壓力時,可以從主內存中丟棄它們。
釋放可回收物理內存頁並重新調整其用途的過程稱為 (surprise!) reclaim 。
Linux支持非同步或同步回收頁,取決於系統的狀態。
當系統負載不高時,大部分內存是空閑的,可以立即從空閑頁得到分配。
當系統負載提升後,空閑頁減少,當達到某個閾值( low watermark )時,內存分配請求將喚醒 kswapd 守護進程。它將以非同步的方式掃描內存頁。如果內存頁中的數據在其他地方也有,則釋放這些內存頁;或者退出內存到後置存儲設備(關聯 臟頁 )。
隨著內存使用量進一步增加,並達到另一個閾值- min watermark -將觸發回收。這種情況下,分配將暫停,直到回收到足夠的內存頁。
當系統運行時,任務分配並釋放內存,內存變得碎片化。
雖然使用虛擬內存可以將分散的物理頁表示為虛擬連續范圍,但有時需要分配大的連續的物理內存。這種需求可能會提升。例如,當設備驅動需要一個大的DMA緩沖區時,或當THP分配一個大頁時。
內存地址壓縮(compaction ) 解決了碎片問題。
該機制將佔用的頁從內存zone的下部移動到上部的空閑頁。壓縮掃描完成後,zone開始處的空閑頁就並在一起了,分配較大的連續物理內存就可行了。
與 reclaim 類似, compaction 可以在 kcompactd守護進程中非同步進行,也可以作為內存分配請求的結果同步進行。
在存在負載的機器上,內存可能會耗盡,內核無法回收到足夠的內存以繼續運行。
為了保障系統的其餘部分,引入了 OOM killer 。
OOM killer 選擇犧牲一個任務來保障系統的總體健康。選定的任務被killed,以期望在它退出後釋放足夠的內存以繼續正常的操作。
『陸』 linux /proc/net/dev裡面都是什麼意思
記錄了不同網路介面(interface)上的各種包的記錄
第一列是介面名稱,一般專你能看到 lo (自環,loopback介面)和屬 eth0 (網卡)
第二大列是這個介面上收到的包統計,第三大列是發送的統計,每一大列下又分為以下小列
收(如果是第三大列,就是發)位元組數(byte), 包數(packet), 錯誤包數(errs), 丟棄包數(drop), fifo (First in first out)包數, frame (幀,這一項對普通乙太網卡應該無效的)數, 壓縮(compressed)包數(不了解), 多播(multicast, 比如廣播包或者組播包)包數。
『柒』 linux 文件系統 是什麼意思
文件系統就是數據的儲存結構.
不要以為你的硬碟儲存東西很理所當然,沒有文件系統,你存的只回是01010100011101010101010
你的答Windows文件系統就是NTFS FAT什麼的.
Linux只是用了不同的.ext3 ext4 reiserFS 什麼的.
『捌』 Linux文件系統中包括的主要文件類型有哪些
Linux 系統核心支持十多種文件系統類型:jfs,ReiserFS,ext,ext2,ext3,iso9660,xfs,minx,msdos,umsdos,Vfat,NTFS,Hpfs,Nfs,smb,sysv,proc 等. x0dx0a下面是主要分類:x0dx0a一, ext ext 是第一個專門為 Linux 的文件系統類型,叫做擴展文件系統.x0dx0a二, ext2 ext2 是為解決 ext 文件系統的缺陷而設計的可擴展的高性能的文件系統.又被稱為 二級擴展文件系統x0dx0a三, ext3 ext3 是由開放資源社區開發的日誌文件系統,. ext3 被設計成是 ext2 的升級版本。x0dx0a四, jsf jsf 提供了基於日誌的位元組級文件系統,該文件系統是為面向事務的高性能系統而開發的。x0dx0a五,ReiserFS ReiserFS 基於平 衡樹結構的 、ReiserFS 文件系統在網上公布.ReiserFS 3.6.x(作為 Linux 2.4 一部分 的版本),設計成員相信最好的文件系統是那些能夠有助於創建獨立的共享環境或者命名空間的文件系統。x0dx0a六,Xfs xfs 是一種非納沖禪常優秀的日誌文件系統,它是 SGI 公司設計的.xfs 被稱為業界最先進 的,最具可升級性的文件系統技術.它是一個全 64 位,快速,穩固的日誌文件系統,x0dx0a其他文件系統簡介:x0dx0aMinix:Llnux 支持的第一個文件系統,對用戶有很多限制而且性能低下x0dx0aXia:Minix 文件系統修正後的版本.在一定程度上解決了文件名和文件系統大小的x0dx0aMsdos:msdos 是在 Dos,Windows 和某些 OS/2 操作系統上使用的一種文件系 統,其名稱採用"8+3"的形式,即 8 個字元的文件名加上 3 個字元的擴展名. x0dx0aumsdos:Linux 下的擴展 msdos 文件系統驅動,支持長文件名,所有者,允許 許可權,連接和設備文件.允許一個普通的 msdo s 文件系統用於 Linux,而且無須為它建 立單獨的分區. x0dx0aiso9660:名. 標准 CDROM 文件系統,通用的 Rock Ridge 增強系統,允許長文件 Vfat:vfat 是 Windows9x 和 Windows NT/2000 下使用的一種 Dos 文件系統, 其在 Dos 文件系統的基礎上增加了對長文件名的支持. x0dx0aNfs:Sun 公司推出的網路文件系統,允許多台計算機之間共享同一文件系統,易 於從所有這些計算機上存取文件. x0dx0aHpfs: High Performance File System(HPFS) 高性能文件系統(HPFS) HPFS 是 Microsoft 的 LAN Manager 中的文件系統,同時也是 IBM 的 LAN Server 和 OS/2 的文件系統.HPFS 能訪問較大的硬碟驅動器,提供更多的組織特性並改善了文件 系統的安全特性. x0dx0aSmb:smb 是一種支持 Windows for workgroups,Windows NT 和 Lan Man ager 的基於 SMB 協議的網路操作系統. x0dx0aSysv:sysv 文件系統實際上是 System V/Coherent 在 Linux 平台上的文件系統. x0dx0aNcpfs:ncpfs 是一種 Novell NetWare 使用的 NCP 協議的網路操作系統. x0dx0aProc:proc 是 Linux 系統中作為一種偽文件系統出現的,它用來作為連接內核數據 結構的界面. NTFS:微軟 Windows NT 內核的系列操作系統支洞塵持的,一個特別為網路和判跡磁碟配 額,文件加密等管理安全特性設計的磁碟格式.