linux記憶體基礎知識和相關調優方案,linux調優
記憶體是電腦中重要的組件之一,它是與CPU進行溝通的橋樑。電腦中所有程式的運行都是在記憶體中進行的,因此記憶體的效能對電腦的影響非常大。記憶體作用是用於暫時存放CPU中的運算資料,以及與硬碟等外部儲存空間交換的資料。只要電腦在運行中,CPU就會把需要運算的資料調到記憶體中進行運算,當運算完成後CPU再將結果傳送出來,記憶體的運行也決定了電腦的穩定運行。對於整個作業系統來說,記憶體可能是最麻煩的的裝置。而其效能的好壞直接影響著整個作業系統。
我們知道CPU是不能與硬碟打交道的,只有資料被載入到記憶體中才可以被CPU調用。cpu在訪問記憶體的時候需要先像記憶體監控程式請求,由監控程式控制和分配記憶體的讀寫請求,這個監控程式叫做MMU(記憶體管理單元)。下面以32位系統來說明記憶體的訪問過程:
32位的系統上每一個進程在訪問記憶體的時候,每一個進程都當做自己有4個G的記憶體空間可用,這叫虛擬記憶體(地址),虛擬記憶體轉化成實體記憶體是通過MMU來完成的。為了能夠從線性地址轉換成物理地址,需要page table(頁表)的記憶體空間,page table要載入到MMU上。為了完成線性地址到物理地址的映射,如果按照1個位元組1個位元組映射的話,需要一張非常大的表,這種轉換關係會非常的複雜。因此把記憶體空間又劃分成了另外一種儲存單元格式,通常為4K。在不同的硬體平台上,它們的大小一般是不一樣的,像x86 32位的有4k的頁;而64位的有4k頁,2M頁,4M頁,8M頁等等,預設都是4k的。每一個進程一般而言都有自己的頁路徑和頁表映射機制,不管那一個頁表都是由核心載入的。每一個進程只能看到自己的線性地址空間,想要增加新的記憶體的時候,只能在自己的線性地址空間中申請,並且申請後一定是通過作業系統的核心映射到物理地址空間中去找那麼一段空間,並且告訴線性地址空間準備好了,可以訪問,並且在page table中增加一條映射關係,於是就可以訪問實體記憶體了,這種叫做記憶體配置。但是新的申請一定是通過操作的核心到實體記憶體中去找那麼一段空間,並且告訴線性地址空間好了,可以建設映射關係,最終page table建立映射關係。
反映了上述描述過程的大體情況。可以看到每一個使用者程式都會有自己的頁表,並且映射到對應的主儲存空間上去。
根據上述文字和圖表的描述可以發現2個問題:
1.每個進程如果需要訪問記憶體的時候都需要去尋找page table的話,勢必會造成伺服器的效能底下
2.如果主儲存空間的記憶體滿了以後,應用程式還需要調用記憶體的時候怎麼辦
對於第一個問題,我們就需要藉助TLB(Translation Lookaside Buffer)翻譯後備緩衝器。TLB是一個記憶體管理單元,它可以用於改進虛擬位址到物理地址轉換速度的緩衝。這樣每次在尋找page table的時候就可以先去TLB中尋找相應的頁表資料,如果有就直接返回,沒有再去尋找page table,並把尋找到的結果緩衝中TLB中。TLB雖然解決了緩衝的功能,但是在那麼page table中尋找映射關係仍然很慢,所以又有了page table的分級目錄。page table可以分為1級目錄,2級目錄和位移量
但是一個進程在啟動並執行時候要頻繁的開啟檔案,關閉檔案。這就意味著要頻繁的申請記憶體和釋放記憶體。有些能夠在記憶體中快取資料的那些進程,他們對記憶體的分配和回收更多,那麼每一次分配都會在頁表中建立一個對應項。所以,就算記憶體的速度很快,大量頻繁的同一時間分配和釋放記憶體,依然會降低伺服器的整體效能。當然記憶體空間不夠用的時候,我們稱為oom(out of memory,記憶體耗盡)。當記憶體耗盡的時候,,整個作業系統掛了。這種情況下我們可以考慮交換分區,交換分區畢竟是由硬碟虛擬出來的記憶體,所以其效能與真正的記憶體相比,差了很多,所以要儘力避免使用交換分區。有實體記憶體空間的時候盡量保證全部使用實體記憶體。cpu無論如何是不能給交換記憶體打交道的,它也只能給實體記憶體打交道,能定址的空間也只能是實體記憶體。所以當真正實體記憶體空間不夠用的時候,會通過LRU演算法把其中最近最少使用的記憶體放到交換記憶體中去,這樣實體記憶體中的那段空間就可以供新的程式使用了。但是這樣會引發另外的一個問題,即原來的進程通過page table尋找的時候,那一段空間的資料已經不屬於它了。所以此刻cpu發送通知或者異常告訴這個程式,這個地址空間已不屬於它,這個時候可能會出現2種情況:
1.實體記憶體有可用的空間可用:這個時候cpu會根據以前的轉換策略會把交換分區中的那段記憶體重新送到實體記憶體中去,但是轉換過來的空間地址不一定會是以前的那一段空間地址,因為以前的那一段空間地址可能已經被別人使用了。
2.實體記憶體沒有可用的空間可用:這個時候依然會使用LRU算髮把當前物理地址空間上最近最少使用的空間地址轉換到交換記憶體中去,並把當前進程需要的這斷在交換空間中的記憶體送到實體記憶體空間中去,並且重建立立映射關係。
上述通知或者異常出現的情況,通常叫做缺頁異常。缺頁異常也分為大異常和小異常兩種。大異常就是訪問的資料記憶體中沒有,不的不去硬碟上載入,無論是從交換記憶體中還是直接從磁碟的某個檔案系統上,反正需要從硬碟上去載入,這種異常載入需要很長時間。小異常就是進程之間通過共用記憶體,第二個進程訪問的時候,查看本地的記憶體映射表沒有,但是其它進程已經擁有了這個記憶體頁,所以可以直接映射,這種異常載入需要的時間一般很短。
在作業系統開機的時候,每一個io裝置都會像cpu申請一些列的隨機連接埠,這種連接埠叫做io連接埠。在IBM PC體繫結構中,I/O地址空間一共提供了65,536個8位的I/O連接埠。正是這些io連接埠的存在,cpu可以與io裝置進行讀寫互動的過程。在執行讀寫操作時,CPU使用地址匯流排選擇所請求的I/O連接埠,使用資料匯流排在CPU寄存器和連接埠之間傳送資料。I/O連接埠還可以被映射到物理地址空間:因此,處理器和I/O裝置之間的通訊就可以直接使用對記憶體進行操作的組合語言指令(例如,mov、and、or等等)。現代的硬體裝置更傾向於映射I/O,因為這樣處理的速度較快,並可以和DMA結合起來使用。這樣io在和記憶體傳資料的時候就不需要通過cpu,cpu把匯流排的控制權交給DMA,每次io傳資料的時候就調用DMA一次,就把cpu給解放了出來。當資料轉送完了以後,DMA通知給cpu中斷一次。DMA在啟動並執行時候對整個匯流排有控制許可權,當cpu發現有其它進程需要使用匯流排的時候,二者就會產生爭用。這個時候,在匯流排控制權的使用上,CPU和DMA具有相等的許可權。只要CPU委託給了DMA,就不能隨意的收回這個委託,就要等待DMA的用完。
如果沒有其它進程可以運行,或者其它進程啟動並執行時間非常短,這個時候CPU發現我們的IO仍然沒有完成,那就意味著,CPU只能等待IO了。CPU在時間分配裡面有個iowait的值,就是CPU在等待IO花費的時間。有些是在同步調用過程中,CPU必須要等待IO的完成;否者CPU可以釋放IO的傳輸在背後自動完成,CPU自己去處理其它的事情。等硬碟資料轉送完成以後,硬碟只需要像CPU發起一個通知即可。CPU外圍有一種裝置,這個裝置叫做可程式化插斷控制器。每一個硬體裝置為了給CPU通訊,在剛開機的時候,在BIOS實現檢測的時候,這個裝置就要到可程式化插斷控制器上去註冊一個所謂的中斷號。那麼這個號碼就歸這個硬體使用了。當前主機上可能有多個硬體,每一個硬體都有自己的號碼,CPU在收到中斷號以後,就能夠通過中斷相量表尋找到那個硬體裝置進行中斷。並且就由對應的IO連接埠過來處理了。
CPU正在運行其它進程,當一個插斷要求發過來的時候,CPU會立即終止當前正在處理的進程,而去處理中斷。當前CPU掛起當前正在處理的進程,轉而去執行中斷的過程,也叫做中斷切換。只不過,這種切換在量層級上比進程切換要低一些,而且任何中斷的優先順序通常比任何進程也要高,因為我們指的是硬體中斷。中斷還分為上半部和下半部,一般而言,上半部就是CPU在處理的時候,把它接進來,放到記憶體中,如果這個事情不是特別緊急(CPU或者核心會自己判斷),因此在這種情況下,CPU回到現場繼續執行剛才掛起的進程,當這個進程處理完了,再回過頭來執行中斷的下半部分。
在32位系統中,我們的記憶體(線性地址)地址空間中,一般而言,低地址空間有一個G是給核心使用的,上面3個G是給進程使用的。但是應該明白,其實在核心記憶體當中,再往下,不是直接這樣劃分的。32位系統和64位系統可能不一樣(物理地址),在32位系統中,最低端有那麼10多M的空間是給DMA使用的。DNA的匯流排寬度是很小的,可能只有幾位,所以定址能力很有限,訪問的記憶體空間也就很有限。如果DMA需要複製資料,而且自己能夠定址實體記憶體,還可以把資料直接壯哉進記憶體中去,那麼就必須保證DMA能夠定址那段記憶體才行。定址的前提就是把最低地址斷M,DA的定址範圍內的那一段給了DMA。所以站在這個角度來說,我們的記憶體管理是分地區的。
在32位系統上,16M的記憶體空間給了ZONE_DMA(DMA使用的物理地址空間);從16M到896M給了ZONE_NORMAL(正常物理地址空間),對於Linux作業系統來說,是核心可以直接存取的地址空間;從896M到1G這斷空間叫做"Reserved"(預留的物理地址空間);從1G到4G的這段物理地址空間中,我們的核心是不能直接存取的,要想訪問必須把其中的一段內容映射到Reserved來,在Reserved中保留出那一段記憶體的地址編碼,我們核心才能上去訪問,所以核心不直接存取大於1G的物理地址空間。所以在32位系統上,它訪問記憶體當中的資料,中間是需要一個額外步驟的。
在64位系統上,ZONE_DAM給了低端的1G地址空間,這個時候DMA的定址能力被大大加強了;ZONE_DAM32可以使用4G的空間;而大於1G以上給劃分了ZONE_NORMAL,這段空間都可以被核心直接存取。所以在64位上,核心訪問大於1G的記憶體位址,就不需要額外的步驟了,效率和效能上也大大增加,這也就是為什麼要使用64位系統的原因。上述過程的描述圖如下:
在現在的PC架構上,AMD,INTER都支援一種機制,叫做PEA(實體位址延伸)。所謂PAE。指的是在32位系統的地址匯流排上,又擴充了4位,使得32位系統上的地址空間可以達到64G。當然在32為系統上,不管你的實體記憶體有多大,單個進程所使用的空間是無法擴充的。因為在32位的系統上,線性地址空間只有4個G,而單個進程能夠識別的訪問也只有3個G。
linux的虛擬記憶體子系統包含了以下幾個功能模組:
slab allocator,zoned buddy allocator,MMU,kswapd,bdflush
slab allocator叫做slab分配器
buddy allocator又叫做buddy system,叫做夥伴系統,也是一種記憶體 Clerk
buddy system是工作在MMU之上的,而slab allocator又是工作在buddy system之上的。
系統中的記憶體頻繁分配和回收勢必會造成記憶體片段,為了盡量的避免記憶體片段,buddy system在實現記憶體配置時,它事先可以將記憶體先劃分成大小像似的多種不同的單位。分配出去的時候儘可能找那個最適合的那段記憶體空間向外分配,並且如果某一進程的記憶體空間釋放以後,它能夠將多個離散的,相鄰的小記憶體空間合并成一段更大的連續地區。所以分配的時候,儘可能找最適合的縫隙進行分配,而最終能夠把多個進程所釋放的地址空間合并起來成為一段連續的空間,並且沒有劃分頁。進程的有些所需要的記憶體空間是不允許分頁的,所以說如果沒有一大段的連續記憶體空間,這段資訊將無法儲存。所以記憶體在分配的時候儘可能找最佳空間像外分配,並且回收的時候能夠合并記憶體成連續的大記憶體空間。這就是buddy system的意義,用於避免記憶體外片段。所謂外片段,就是指記憶體中有很多頁都不連續。buddy allocator只是用來分配頁面或者非頁面那些連續的空間的申請,一般這種空間層級都比較大,但有些時候我們需要的空間都比較小,比如開啟一個檔案,訪問INODE的時候。這種時候有可能放在一個頁面中,但是這個頁中就只存這個INODE,就會造成空間的大大浪費。所以對於這些資訊的儲存,雖然有可能也是將資料放在頁中,但是頁中肯定不只是為了存這一個資料,有可能存多個資料。那麼如何快速的儲存下來呢?每一個INODE就是一個特殊的資料結構,它裡面有各種資訊,所以我們叫做特殊的資料結構。那我們儲存的時候,不僅要儲存資料,還要儲存它的結構,而這種資料是小於頁面的。想要達到快速儲存,這就是slab allocator存在的意義了。它能夠實現自己去申請幾個頁面,把這幾個頁面劃分成獨特的內部適於儲存某種對象的資料結構。直接給劃分好,結構也給存好了,當需要儲存INODE的時候,把INODE資訊填寫進去就可以了,結構都事先給分配好了。當一個檔案關閉以後,它的INODE也要清除出去了。slab allocator還能把它清除出去的那些INODE收回回來供其它進程開啟檔案時繼續使用。這就是為了避免記憶體內片段,完成小片記憶體分布的。
當我們實現buddy system在記憶體配置空間時,如果實體記憶體空間不夠用,有可能會用到交換記憶體。kswapd就是實現swap out和swap in的。將資料放到swap上和從swap上將資料載回到記憶體中。當然更應該明白的是,如果某一個進程修改了資料,這個資料最終是要從記憶體上填到磁碟中去的。因為進程訪問的資料都是在記憶體中完成的,這些資料最終要寫到附存上去,才能完成資料的永久儲存。怎麼進行這個寫操作,就是靠pdflush來完成的。我們一往記憶體中寫資料,並不是馬上就寫入到磁碟中的,因為這樣的效能太差了,這個過程是非同步,而不是同步的。由我們核心週期性將那些已經儲存了的資料給它同步到磁碟上去。pdflush是一個核心的線程,通常一塊硬碟有一個,監控著當前記憶體空間中有那些資料(通常叫做髒頁)已經被修改過了,尚且未同步到磁碟中的資料給儲存到磁碟中去。當然它並不是一定要主動式監控,如果實體記憶體中的髒頁已經達到了一個百分比,它也會去主動同步資料的。
實體記憶體中那些被修改了的資料是不能交換的,必須要往磁碟中寫,因為交換可能會帶來一些故障。所以,我們能夠交換到交換記憶體中的資料,一定是沒有被修改過的資料,修改過的,要騰出來,就只能往硬碟中寫。
有了記憶體的基礎知識概念以後,下面就可以來看一些關於記憶體的常用調優方案了:
一.與hugepage相關的調優參數
cat /proc/zoneinfo 可以查看當前作業系統上的記憶體區段的分割情況
HugePage:大頁面
在centos64位的系統上不僅支援大頁面,還支援透明大頁(THP,transparent huge page)
透明大頁簡單來說就是對匿名記憶體段的使用。它能夠不需要任何使用者的參與,自動的由作業系統在背後使用大頁面來管理匿名記憶體段。那一段記憶體是匿名記憶體段呢?RSS減去共用記憶體就是匿名記憶體段。透明大頁對於CENTOS64位的系統來說支援兩種大小,一個是2M,一個是1G。1G在TB記憶體級的使用上通常很有效。在幾十G,上百G的記憶體中,2M通常是不錯的選擇。通常只有實體記憶體大於4G的時候,透明大頁的機制才會啟動起來。透明大頁通常情況下,是系統在背後悄悄使用的,為什麼叫做透明,是因為使用者是不需要參與的。
在/proc/zoneinfo下的 nr_anon_transparent_hugepages這個參數可以看到透明大頁的使用方式,通常一個頁面是2M。
在/proc/meminfo下的:
AnonHugePages:可以看到透明頁的總大小
Hugepagesize:大頁的大小。
HugePages_Total: 大頁的總數
HugePages_Free: 剩餘大頁的總數
HugePages_Rsvd:預留的大頁總數
HugePages_Total是使用者自己指定的,而非透明大頁。
使用vm.nr_hugepages = n可以手動指定大頁的個數。一般來說,我們可以自己手動定義把他們當做共用記憶體空間來使用來掛載,直接把他當做記憶體中的分區掛載到某個檔案系統的目錄上。使用方法如下:
mkdir /hugepages
mount -t hugetlbfs none /hugepages
然後就可以把hugepages當做記憶體磁碟來使用了。當然,平時的時候是不需要我們自己指定的,比如說像mysql伺服器,在mysql伺服器上有一個變數,把那個變數當中定義要使用透明大頁,它就會自動使用了。
二.與buffer和cache的相關調優參數
/proc/sys/vm/drop_caches可以手動強制釋放buffer和cache,其接受3個參數
如果為1:就釋放所有的pagecache頁緩衝
如果為2:就釋放dentries和inode的緩衝
如果為3:就釋放pagecache,dentries和inode的緩衝
buffer和cache中的緩衝分為兩大類:
1.pagecache:用來快取頁面資料的,通常緩衝的是檔案資料,開啟的檔案內容
2.buffers:緩衝的是檔案的中繼資料(inode和dentries),有時候也用來緩衝寫請求的
echo 1 > /proc/sys/vm/drop_caches 就釋放上面的第一條
echo 2 > /proc/sys/vm/drop_caches 就釋放上面的第二條
echo 3 > /proc/sys/vm/drop_caches 就釋放上面兩條之和
三.與交換記憶體的相關調優參數
/proc/sys/vm/swappiness表示核心用多大的傾向去使用交換記憶體
值越大就越傾向於使用交換記憶體,值越小越不傾向使用交換記憶體(但是這並不代表不能使用交換記憶體),預設值為60,取值範圍為0-100。在伺服器上建議把這個值調小,甚至為0。一般而言,當我們目前已經映射到頁表中的記憶體百分比(也就說我們實體記憶體中的百分比有多少被頁表使用了)+vm.swappiness的值大於等於100的時候,就會開始啟用交換記憶體。
交換記憶體的使用建議:
1.在執行批處理計算(科學計算)的伺服器上,可以把它設定的相對偏大
2.在資料庫伺服器上,可以設定為小於等於1G,在資料庫伺服器應該勁量避免使用交換記憶體
3.在應用伺服器上,可以設定為RAM*0.5,當然這個是理論值
如果不的不使用交換記憶體,應該把交換記憶體放到最靠外的磁軌分區上,因為最外邊的磁碟的訪問速度最快。所以如果有多塊硬碟,可以把每塊硬碟的最外層的磁軌拿一小部分出來作為交換分區。交換分區可以定義優先順序,因此把這些硬碟的交換記憶體的優先順序設定為一樣,可以實現負載平衡的效果。定義交換分區優先順序的方法為編輯/etc/fstab:
/dev/sda1 swap swap pri=5 0 0
/dev/sdb1 swap swap pri=5 0 0
/dev/sdc1 swap swap pri=5 0 0
/dev/sdd1 swap swap pri=5 0 0
四.記憶體耗盡時候的相關調優參數
當Linux記憶體耗盡的時候,它會殺死那些佔用記憶體最多的進程,以下三種情況會殺死進程:
1.所有的進程都是活動進程,這個時候想交換出去都沒有閒置進程
2.沒有可用的page頁在ZONE_NORMAL中
3.有其它新進程啟動,申請記憶體空間的時候,要找一個空閑記憶體給做映射,但是這個時候找不到了
一旦記憶體耗盡的時候,作業系統就會啟用oom-kill機制。
在/proc/PID/目錄下有一個檔案叫做oom_score,就是用來指定oom的評分的,就是壞蛋指數。
如果要手動啟用oom-kill機制的話,只需要執行echo f>/proc/sysrq-trigger即可,它會自動殺掉我們指定的壞蛋指數評分最高的那個進程
可以通過echo n > /proc/PID/oom_adj來調整一個進程的壞蛋評分指數。最終的評分指數就是2的oom_adj的值的N次方。假如我們的一個進程的oom_adj的值是5,那麼它的壞蛋評分指數就是2的5次方。
如果想禁止oom-kill功能的使用可以使用vm.panic_on_oom=1即可。
五.與容量有關的記憶體調優參數:
overcommit_memory,可用參數有3個,規定是否能夠過量使用記憶體:
0:預設設定,核心執行啟發學習法的過量使用處理
1:核心執行無記憶體的過量使用處理。使用這個值會增大記憶體超載的可能性
2:記憶體的使用量等於swap的大小+RAM*overcommit_ratio的值。如果希望減小記憶體的過度使用,這個值是最安全的
overcommit_ratio:
將overcommit_memory指定為2時候,提供的物理RAM比例,預設為50
六.與通訊相關的調優參數
常見在同一個主機中進行處理序間通訊的方式:
1.通過訊息message;2.通過signal訊號量進行通訊;3.通過共用記憶體進行通訊,跨主機常見的通訊方式是rpc
以訊息的方式實現進程通訊的調優方案:
msgmax:以位元組為單位規定訊息佇列中任意訊息的最大允許大小。這個值一定不能超過該隊列的大小(msgmnb),預設值為65536
msgmnb:以位元組為單位規定單一訊息佇列的最大值(最大長度)。預設為65536位元組
msgmni:規定訊息佇列識別符的最大數量(及隊列的最大數量)。64位架構機器的預設值為1985;32位架構機器的預設值為1736
以共用記憶體方式實現進程通訊的調優方案:
shmall:以位元組為單位規定一次在該系統中可以使用的共用記憶體總量(單次申請的上限)
shmmax:以位元組為單位規定每一個共用記憶體片段的最大大小
shmmni:規定系統範圍內最大共用記憶體片段。在64和32位的系統上預設值都是4096
七.與容量相關的檔案系統可調優參數:
file-max:列出核心分配的檔案控制代碼的最大值
dirty_ratio:規定百分比值,當髒資料達到系統記憶體總數的這個百分比值後開始執行pdflush,預設為20
dirty_background_ratio:規定百分比值,當某一個進程自己所佔用的髒頁比例達到系統記憶體總數的這個百分比值後開始在後台執行pdflush,預設為10
dirty_expire_centisecs:pdlush每隔百分之一秒的時間開啟起來重新整理髒頁,預設值為3000,所以每隔30秒起來開始重新整理髒頁
dirty_writeback_centisecs:每隔百分之一秒開始重新整理單個髒頁。預設值為500,所以一個髒頁的存在時間達到了5秒,就開始重新整理髒
八.linux記憶體常用的觀察指標命令:
Memory activity
vmstat [interval] [count]
sar -r [interval] [count]
Rate of change in memory
sar -R [interval] [count]
frmpg/s:每秒釋放或者分配的記憶體頁,如果為正數,則為釋放的記憶體頁;如果為負數,則為分配的記憶體頁
bufpg/s:每秒buffer中獲得或者釋放的記憶體頁。如果為正數則為獲得的記憶體頁,為負數。則為釋放的記憶體頁
campg/s:每秒cache中獲得或者釋放的記憶體頁。如果為正數則為獲得的記憶體頁,為負數。則為釋放的記憶體頁
Swap activity
sar -W [interval] [count]
ALL IO
sar -B [interval] [count]
pgpgin/s:每秒從磁碟寫入到核心的塊數量
pgpgout/s:每秒從核心寫入到磁碟的塊數量
fault/s:每秒鐘出現的缺頁異常的個數
majflt/s:每秒鐘出現的大頁異常的個數
pgfree/s:每秒回收回來的頁面個數
推薦一本linux 叢集方面的書
循序漸進Linux 基礎知識、伺服器搭建、系統管理、效能調優、叢集應用
第一部分 基礎知識篇
第1章 Linux學習方法論
第2章 Linux系統的安裝與基本配置
第3章 系統基本結構
第4章 Linux常用命令及其使用
第5章 Linux下軟體包的安裝與管理
第二部分 伺服器搭建篇
第6章 Linux伺服器網路設定
第7章 Linux伺服器安全性原則
第8章 架設Linux伺服器
第9章 伺服器故障排查
第三部分 系統管理篇
第10章 Linux使用者權限管理
第11章 Linux磁碟儲存管理
第12章 Linux檔案系統管理
第13章 Linux記憶體管理
第14章 Linux系統進程管理
第四部分 效能調優篇
第15章 Linux系統最佳化思路
第16章 Linux系統效能評估與最佳化
第五部分 叢集、高可用篇
第17章 Linux叢集技術概論
第18章 Linux-HA開源軟體Heartbeat
第19章 Linux儲存叢集
第20章 Linux負載平衡軟體LVS
Linux叢集文庫P叢集技術MC-ServiceGuard的應用
Linux機群系統並行程式調試器的設計與實現
Linux系統中LVS的實現剖析
Linux下的負載平衡叢集LVS實現分析與測試
分布式網路環境下的Server Load Balancer原理及演算法
基於Linux 的PC 叢集
基於Linux的Beowulf叢集的實現
基於Linux的伺服器叢集方案
基於Linux的叢集管理系統設計與實現
基於Linux的進程遷移機制設計
基於Linux虛擬伺服器的負載平衡
基於叢集式系統的GSAD演算法
訊息中介軟體的叢集技術
一種新的基於Linux的郵件伺服器叢集系統
有TCP串連容錯功能的網路Server Load Balancer調度系統
www.ithov.com/Book/system/Linux/29167.shtml
《LINUX叢集體繫結構》電子書前言
第1章 Linux叢集電腦基礎
第2章 多處理器體繫結構
第3章 處理序間通訊
第4章 裝配叢集的硬體
第5章 配置相關作業系統檔案
第6章 配置軟體開發使用者環境
第7章 主從介面軟體體繫結構
第8章 外部效能測量和分析
第9章 內部效能測量和計時
第10章 健壯的軟體
第11章 深入研究
第12章 結論
附錄 原始碼
Linux作業系統下的叢集原理及實戰經曆 os.yesky.com/lin/496/3057996.shtml
tomcat7怎性可以調優,詳細一點不是tomcat5與6
本來就可以了吧,基本調不了
你還是講開啟Servlet重新載入功能吧(在修改servlet後,有時tomcat不會立即識別,開啟該功能後,運行時servlet程式會重新載入記憶體,從而修改後能立即識別)
方法如下:在tomcat的安裝目錄下找到conf檔案夾,開啟找到context.xml檔案,用記事本的方式開啟,找到 <Context>標籤
改為<Context reloadable="true">
就這樣了