优化pxe网启动时tftp的传输速度 --- 针对pxelinux和bootmgr
作為一名IT人士,一般的計算機維護當(dāng)然不好意思找別人。 于是自己用pxelinux搭了個網(wǎng)絡(luò)啟動環(huán)境,可以啟動各種WinPE,以供折騰電腦系統(tǒng),刷新固件的需要。
只是一般的網(wǎng)絡(luò)啟動都是基于tftp協(xié)議的,傳輸文件那叫一個慢。啟動時光是加載映像文件就得幾分鐘,簡直就像活在史前一樣。 找了一圈方法,沒轍。 好在這東西也就救急時用用,湊活湊活也行。
于是就這么湊錯了幾年。。。
最近升級到win8了,為了維護環(huán)境,加了幾個win7,win8的PE。 winxp的pe就在啟動菜單上無比折騰(要到二進制文件里去改),win7也沒好到哪兒去。但是新的bootmgr本身 提供了啟動菜單, 為了簡單起見,干脆放棄了在pxelinux里集成多個winpe的菜單了,直接單弄一個目錄直接啟動bootmgr。需要的時候切換下目錄就行了,比強行改二進制文件,然后弄到pxelinux菜單上不知道輕松多少倍。
好了,那就從bootmgr的菜單折騰起。過程比較無趣繁瑣,一帶而過:隨便找個例子教程照著改;結(jié)果似乎有時好使有時不好使,原因不明;一怒之下把BCD的規(guī)范定義翻了個遍; 問題解決了,原因也搞明白了;順帶著還有個意外的收獲。
這個意外的收獲就是發(fā)現(xiàn)在BCD的定義中,有兩個涉及到TFTP的參數(shù),分別是 windows size 和 block size。當(dāng)時一看到這兩個參數(shù)就眼前一亮,要知道TFTP的傳輸性能弱,關(guān)隘全在這倆參數(shù)上。
趕緊把這倆參數(shù)仔仔細細的查清楚了,立刻加到bootmgr的bcd里面。
啟動一試, 效果非常顯著!!
默認(rèn)的網(wǎng)絡(luò)啟動過程,網(wǎng)卡的使用率始終在10mbps以下徘徊,大部分情況下更低,一個3M大小的字體文件,都要拷貝好一會兒。加上參數(shù)后,網(wǎng)卡的利用率立刻飆升到40mbps上下,一般都不低于20Mbps。 網(wǎng)絡(luò)加載速度一下子快樂好幾倍,再也不用傻等了,非常之爽。
下面是我的 bcdedit /store bcd /enum all 的部分輸出:
安裝程序 Ramdisk 選項
---------------------
標(biāo)識符 {ramdiskoptions}
ramdisksdidevice boot
ramdisksdipath BOOTBOOT.SDI
ramdisktftpblocksize 40960
ramdisktftpwindowsize 100
其中可以看到 block size 設(shè)成了 40K。window size 設(shè)成了 100。
block size 設(shè)成 40k 是為了配合udp封包的優(yōu)化,雖然理論上可以到63k左右(64k - 包頭結(jié)構(gòu)),稍微留點余量還是比較穩(wěn)妥的。 實際使用時,block size其實可以更大更隨意,比如到1M大小,只是這是程序?qū)拥倪壿嫞搅薝DP層還是自動拆分了。 這個地方選40k純屬經(jīng)驗,并沒有對比過其他的數(shù)值并優(yōu)化。
windows size 這個值其實比較隨意,但只在較小的數(shù)值范圍時,才滿足正比關(guān)系(越大效率越高);超過一定的數(shù)值后,再大也沒多大的意義了,而且效率有可能更低,甚至伴隨更多的穩(wěn)定性問題。
我一開始設(shè)置的是10,效果就很好了;后來為了對比下,就調(diào)成了100,發(fā)現(xiàn)100的效率跟10的效率,幾乎沒有啥區(qū)別,即便有提升,估計也就 百分之幾頂多十幾的提升。 其實這個地方10就足夠了,我這兒是因為沒啥區(qū)別,所以測試后沒有改回來。
原諒我懶于編排文章結(jié)構(gòu),就這樣吧: 以上是bootmgr的部分
------------------------------------------------ 分割線 ------------------------------------------------
以下是pxelinux的部分
上文說到bootmgr里面有兩個很隱秘的參數(shù),解決了網(wǎng)絡(luò)傳輸性能的大問題。 但是這僅僅針對bootmgr才起作用;對于 基于 pxelinux 啟動的部分,還是老樣子。
但是有了上文的成功案例的鼓勵,就更加有了改造pxelinux的信心。
過程同樣是無趣且冗長波折的,這里直接跳轉(zhuǎn)到結(jié)果:
結(jié)果就是下載syslinux的源碼,修改后重新編譯---聽起來有點麻煩,其實非常簡單,尤其是Linux環(huán)境下,直接打make就行(其實還需要安裝個uuid-dev的包,我沒看README,結(jié)果找這個uuid.h找了半天,找到了才發(fā)現(xiàn)人README里寫的很清楚)。
修改的地方有兩處,都在 core/fs/pxe目錄下:
對于 pxe.c, 找到 1408 這個字符串,改成 40960. 這是定義blocksize。
對于 pxe.h,找到PKTBUF_SIZE 的定義,把 2048 改成 (1024*64)。 這里定義的是接受緩沖區(qū)的大小。
然后
make
sudo make netinstall
就行了。
其實光make就行了,只是他的makefile寫的不怎樣,編譯出來的文件都分散在各個目錄里了,找起來很麻煩。 make netinstall 會把這些編譯出來的文件,都拷貝到 /tftpdroot里,找起來就方便多了。由于是在根目錄下創(chuàng)建/tftpdroot目錄,所以需要sudo,如有已有目錄且有權(quán)限,是不必sudo的。
說下效果吧:
一句話,非常棒!!
pxelinux 的這個部分實現(xiàn)得非常精簡,只支持一個 block size參數(shù),不支持window機制。但即便如此,他的效率仍高過了具備window機制的bootmgr。網(wǎng)卡利用率最高可以到60Mbps上下,最低也有20Mbps左右。相對于原來,簡直是飛一般的速度!
再多啰嗦句:
syslinux這里的默認(rèn)值真的是很詭異 ,1408??這是數(shù)字一眼就讓人想起modem的MTU。 問題是這個東東大部分是局域網(wǎng)用的,跟MTU有個毛關(guān)系啊。
pxelinux在他的說明里,一再強調(diào) 所設(shè)置的 TFTPD服務(wù)器一定要支持 tsize 選項,不兼容沒有tsize選項的tftpd。言下之意是pxelinux是比較新的,支持比較高級功能的。
但是他所設(shè)定的1408的block size,僅僅比最初始的恐龍時代的設(shè)定------512,多了一倍多而已,根本就是聊勝于無。
還是趕緊改了吧。
最后,對于實在不想自己編譯的同學(xué),我把我的編譯結(jié)果放在這兒了。
http://download.csdn.net/detail/whoo/5054668(注:這個包的blksize設(shè)為40k,對于有些機器來說過大了,存在兼容性問題。在將blksize調(diào)整為16k之后,經(jīng)測試速度幾乎沒有降低,而兼容性好了很多------手頭可測試的設(shè)備都通過了,但有網(wǎng)友反饋仍有問題。 新的下載地址是這個 http://download.csdn.net/detail/whoo/5150778)
補充下就是:我的各種測試中,pxelinux.0 是沒問題的的。 但是gpxelinux.0在vmware中就報錯。 經(jīng)過一段時間的嘗試后,我已經(jīng)放棄gpxe這個東東了,所以未做進一步的測試,不清楚這一問題到底是gpxe在vmware中的兼容問題,還是修改后的傳輸參數(shù)造成的。
---------------------
作者:whoo
來源:CSDN
原文:https://blog.csdn.net/whoo/article/details/8571550
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的优化pxe网启动时tftp的传输速度 --- 针对pxelinux和bootmgr的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乐器库的混合
- 下一篇: 【机器学习经典算法源码分析系列】-- 逻