優化pxe網啓動時tftp的傳輸速度 --- 針對pxelinux和bootmgr

  原創地址:http://blog.csdn.net/whoo/article/details/8571550


   作爲一名IT人士,一般的計算機維護當然不好意思找別人。 於是自己用pxelinux搭了個網絡啓動環境,可以啓動各種WinPE,以供折騰電腦系統,刷新固件的需要。

 

    只是一般的網絡啓動都是基於tftp協議的,傳輸文件那叫一個慢。啓動時光是加載映像文件就得幾分鐘,簡直就像活在史前一樣。 找了一圈方法,沒轍。 好在這東西也就救急時用用,湊活湊活也行。

 

   於是就這麼湊錯了幾年。。。

 

   最近升級到win8了,爲了維護環境,加了幾個win7,win8的PE。 winxp的pe就在啓動菜單上無比折騰(要到二進制文件裏去改),win7也沒好到哪兒去。但是新的bootmgr本身 提供了啓動菜單,   爲了簡單起見,乾脆放棄了在pxelinux裏集成多個winpe的菜單了,直接單弄一個目錄直接啓動bootmgr。需要的時候切換下目錄就行了,比強行改二進制文件,然後弄到pxelinux菜單上不知道輕鬆多少倍。

 

   好了,那就從bootmgr的菜單折騰起。過程比較無趣繁瑣,一帶而過:隨便找個例子教程照着改;結果似乎有時好使有時不好使,原因不明;一怒之下把BCD的規範定義翻了個遍; 問題解決了,原因也搞明白了;順帶着還有個意外的收穫。

 

   這個意外的收穫就是發現在BCD的定義中,有兩個涉及到TFTP的參數,分別是 windows size 和 block size。當時一看到這兩個參數就眼前一亮,要知道TFTP的傳輸性能弱,關隘全在這倆參數上。

   趕緊把這倆參數仔仔細細的查清楚了,立刻加到bootmgr的bcd裏面。

   啓動一試, 效果非常顯著!!

   默認的網絡啓動過程,網卡的使用率始終在10mbps以下徘徊,大部分情況下更低,一個3M大小的字體文件,都要拷貝好一會兒。加上參數後,網卡的利用率立刻飆升到40mbps上下,一般都不低於20Mbps。 網絡加載速度一下子快樂好幾倍,再也不用傻等了,非常之爽。

 

下面是我的 bcdedit /store bcd /enum all 的部分輸出:

 

  1. 安裝程序 Ramdisk 選項  

  2. ---------------------  

  3. 標識符                  {ramdiskoptions}  

  4. ramdisksdidevice        boot  

  5. ramdisksdipath          \BOOT\BOOT.SDI  

  6. ramdisktftpblocksize    40960  

  7. ramdisktftpwindowsize   100  

 

其中可以看到 block size 設成了 40K。window size 設成了 100。 

block size 設成 40k 是爲了配合udp封包的優化,雖然理論上可以到63k左右(64k - 包頭結構),稍微留點餘量還是比較穩妥的。 實際使用時,block size其實可以更大更隨意,比如到1M大小,只是這是程序層的邏輯,到了UDP層還是自動拆分了。 這個地方選40k純屬經驗,並沒有對比過其他的數值並優化。

 

windows size 這個值其實比較隨意,但只在較小的數值範圍時,才滿足正比關係(越大效率越高);超過一定的數值後,再大也沒多大的意義了,而且效率有可能更低,甚至伴隨更多的穩定性問題。

我一開始設置的是10,效果就很好了;後來爲了對比下,就調成了100,發現100的效率跟10的效率,幾乎沒有啥區別,即便有提升,估計也就 百分之幾頂多十幾的提升。 其實這個地方10就足夠了,我這兒是因爲沒啥區別,所以測試後沒有改回來。

 

 

原諒我懶於編排文章結構,就這樣吧:  以上是bootmgr的部分
------------------------------------------------ 分割線 ------------------------------------------------

以下是pxelinux的部分

 

 

 

上文說到bootmgr裏面有兩個很隱祕的參數,解決了網絡傳輸性能的大問題。 但是這僅僅針對bootmgr才起作用;對於 基於 pxelinux 啓動的部分,還是老樣子。

但是有了上文的成功案例的鼓勵,就更加有了改造pxelinux的信心。

 

過程同樣是無趣且冗長波折的,這裏直接跳轉到結果:

結果就是下載syslinux的源碼,修改後重新編譯---聽起來有點麻煩,其實非常簡單,尤其是Linux環境下,直接打make就行(其實還需要安裝個uuid-dev的包,我沒看README,結果找這個uuid.h找了半天,找到了才發現人README裏寫的很清楚)。

 

修改的地方有兩處,都在 core/fs/pxe目錄下:

對於 pxe.c, 找到 1408 這個字符串,改成 40960. 這是定義blocksize。

對於 pxe.h,找到  PKTBUF_SIZE 的定義,把 2048 改成 (1024*64)。 這裏定義的是接受緩衝區的大小。

 

然後 

make

sudo make netinstall

就行了。

 

其實光make就行了,只是他的makefile寫的不怎樣,編譯出來的文件都分散在各個目錄裏了,找起來很麻煩。 make netinstall 會把這些編譯出來的文件,都拷貝到 /tftpdroot裏,找起來就方便多了。由於是在根目錄下創建/tftpdroot目錄,所以需要sudo,如有已有目錄且有權限,是不必sudo的。

 

 

說下效果吧:

  一句話,非常棒!! 

  pxelinux 的這個部分實現得非常精簡,只支持一個 block size參數,不支持window機制。但即便如此,他的效率仍高過了具備window機制的bootmgr。網卡利用率最高可以到60Mbps上下,最低也有20Mbps左右。相對於原來,簡直是飛一般的速度!

 

 

再多囉嗦句:

  syslinux這裏的默認值真的是很詭異 ,1408??這是數字一眼就讓人想起modem的MTU。 問題是這個東東大部分是局域網用的,跟MTU有個毛關係啊。

  pxelinux在他的說明裏,一再強調 所設置的 TFTPD服務器一定要支持 tsize 選項,不兼容沒有tsize選項的tftpd。言下之意是pxelinux是比較新的,支持比較高級功能的。

但是他所設定的1408的block size,僅僅比最初始的恐龍時代的設定------512,多了一倍多而已,根本就是聊勝於無。

  還是趕緊改了吧。

 

 

 

 

 

 

 最後,對於實在不想自己編譯的同學,我把我的編譯結果放在這兒了。

http://download.csdn.net/detail/whoo/5054668 (注:這個包的blksize設爲40k,對於有些機器來說過大了,存在兼容性問題。在將blksize調整爲16k之後,經測試速度幾乎沒有降低,而兼容性好了很多------手頭可測試的設備都通過了,但有網友反饋仍有問題。 新的下載地址是這個 http://download.csdn.net/detail/whoo/5150778

 

 

補充下就是:我的各種測試中,pxelinux.0 是沒問題的的。  但是gpxelinux.0在vmware中就報錯。 經過一段時間的嘗試後,我已經放棄gpxe這個東東了,所以未做進一步的測試,不清楚這一問題到底是gpxe在vmware中的兼容問題,還是修改後的傳輸參數造成的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章