董如意 孔慶 賀洋 陳凱
[摘要]隨著計(jì)算機(jī)網(wǎng)絡(luò)的廣泛應(yīng)用,越來(lái)越多的網(wǎng)絡(luò)服務(wù)程序都要求服務(wù)器具有穩(wěn)定的性能以提供可靠的服務(wù)。本文提出了基于機(jī)器學(xué)習(xí)的服務(wù)器調(diào)優(yōu)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)方法,為提高服務(wù)器的可靠性及高效性提供了較好的解決方案。
[關(guān)鍵詞]機(jī)器學(xué)習(xí) 服務(wù)器調(diào)優(yōu) 線程池
[中圖分類號(hào)]TP181 [文獻(xiàn)標(biāo)識(shí)碼]A [文章編號(hào)]1009-5349(2016)02-0133-01
一、線程池調(diào)優(yōu)系統(tǒng)總體設(shè)計(jì)
線程池調(diào)優(yōu)系統(tǒng)由四個(gè)模塊組成:線程池模塊、性能監(jiān)測(cè)模塊、支持向量機(jī)調(diào)優(yōu)模塊。線程池模塊負(fù)責(zé)線程池的創(chuàng)建與維護(hù),任務(wù)隊(duì)列的任務(wù)管理等,并將任務(wù)隊(duì)列中的用戶任務(wù)取出放入線程池中進(jìn)行執(zhí)行。性能監(jiān)測(cè)模塊負(fù)責(zé)對(duì)表征線程池性能的三個(gè)特征量吞吐量、任務(wù)運(yùn)算時(shí)間和任務(wù)阻塞時(shí)間的監(jiān)測(cè),作為測(cè)試樣本輸入支持向量機(jī)調(diào)優(yōu)模塊中。支持向量機(jī)調(diào)優(yōu)模塊則通過(guò)性能監(jiān)測(cè)模塊提供的測(cè)試樣本,得到所需的最佳線程池尺寸,并與當(dāng)前的線程池尺寸進(jìn)行對(duì)比,最后調(diào)整線程池尺寸到最佳。
二、線程池模塊
線程池模塊主要負(fù)責(zé)線程池內(nèi)線程的創(chuàng)建、銷毀、構(gòu)造任務(wù)隊(duì)列,并將任務(wù)隊(duì)列中的用戶任務(wù)取入線程池中分配空閑線程來(lái)執(zhí)行。系統(tǒng)采用Win32的提供的線程庫(kù),以面向?qū)ο笏枷雽?shí)現(xiàn)相關(guān)功能模塊。線程池模塊主要包括線程池類CPoolThread、任務(wù)隊(duì)列類CJobDequeue、線程類CThread以及同步類CMutex。
線程類CThread最重要的一個(gè)方法是線程的創(chuàng)建方法CThread::Create()。線程創(chuàng)建方法采用了Win32線程庫(kù)提供的線程創(chuàng)建應(yīng)用程序接口CreateThread(Null,0,_ThreadEntry,this,0,&ThreadID;)來(lái)實(shí)現(xiàn)。線程池類CThreadPool主要提供了一個(gè)數(shù)組變量m_list_thread來(lái)維護(hù)一個(gè)線程池,線程池內(nèi)的每個(gè)線程都存在了這個(gè)數(shù)組變量中,而具體的池內(nèi)線程的操作都交給了線程類CThread來(lái)完成。線程池類CThreadPool主要包括初始化線程池的初始化方法CThreadPool::InitInstance()來(lái)實(shí)現(xiàn)線程池內(nèi)所有線程的創(chuàng)建操作,具體通過(guò)CThread類的CThread::Create()方法來(lái)實(shí)現(xiàn)每個(gè)線程的創(chuàng)建。任務(wù)隊(duì)列類CJobQueue是線程池類的一個(gè)對(duì)象,維護(hù)了一個(gè)任務(wù)隊(duì)列數(shù)組列表m_normal_list,用戶任務(wù)經(jīng)過(guò)線程池類添加任務(wù)接口進(jìn)入此數(shù)組列表中。任務(wù)隊(duì)列類通過(guò)隊(duì)列列表來(lái)維護(hù)管理等待中的用戶任務(wù)。同步類CMutex主要是為了實(shí)現(xiàn)程序中的某些互斥操作設(shè)立的,通過(guò)對(duì)私有變量m_lock調(diào)用WinAPI函數(shù)的WaitForSingleObject()與ReleaseMutex()來(lái)實(shí)現(xiàn)程序的加鎖與解鎖操作。
三、性能監(jiān)測(cè)模塊
性能監(jiān)測(cè)模塊主要是監(jiān)測(cè)表征線程池性能的三個(gè)特征量:吞吐量、任務(wù)運(yùn)算時(shí)間和任務(wù)阻塞時(shí)間。由于吞吐量是監(jiān)測(cè)用戶任務(wù)進(jìn)入任務(wù)隊(duì)列的數(shù)量,因此,對(duì)吞吐量的監(jiān)測(cè)可以在任務(wù)隊(duì)列類中實(shí)現(xiàn)。而任務(wù)運(yùn)算時(shí)間和任務(wù)阻塞時(shí)間直接是與線程的執(zhí)行任務(wù)相關(guān)的,因此,將這兩個(gè)量的監(jiān)測(cè)放入線程類中實(shí)現(xiàn)。
性能監(jiān)測(cè)模塊對(duì)吞吐量的監(jiān)測(cè)方法。每當(dāng)有用戶任務(wù)通過(guò)線程池類進(jìn)入任務(wù)隊(duì)列時(shí),任務(wù)隊(duì)列將其成員變量m_tuntu進(jìn)行加1操作,實(shí)現(xiàn)對(duì)吞吐量的實(shí)時(shí)更新。
任務(wù)運(yùn)算時(shí)間的監(jiān)測(cè)方法主要通過(guò)調(diào)用Windows提供的API函數(shù)GetThreadTimes添加至線程類中的Run方法中來(lái)實(shí)現(xiàn)。GetThreadTimes函數(shù)可以返回四個(gè)參數(shù):線程創(chuàng)建時(shí)間、線程退出時(shí)間、系統(tǒng)代碼運(yùn)算時(shí)間和用戶代碼運(yùn)算時(shí)間。因此,可以通過(guò)對(duì)系統(tǒng)代碼時(shí)間與用戶代碼時(shí)間求和來(lái)得到任務(wù)占用CPU的時(shí)間,也就是任務(wù)運(yùn)算時(shí)間。具體做法是當(dāng)線程類中Run方法啟動(dòng)用戶任務(wù)時(shí),即調(diào)用此API函數(shù),獲得任務(wù)進(jìn)入線程池時(shí)間;當(dāng)用戶任務(wù)運(yùn)行結(jié)束時(shí),再次調(diào)用此API函數(shù),即可獲得任務(wù)離開(kāi)線程池時(shí)間,將二者做差即可得到任務(wù)占用CPU的運(yùn)算時(shí)間。
對(duì)任務(wù)阻塞時(shí)間的監(jiān)測(cè)方法的實(shí)現(xiàn)則相對(duì)麻煩一些,因?yàn)闆](méi)有直接測(cè)試任務(wù)阻塞時(shí)間的API函數(shù).但是可以通過(guò)間接的方法來(lái)測(cè)量,即任務(wù)阻塞時(shí)間=任務(wù)執(zhí)行時(shí)間-任務(wù)運(yùn)算時(shí)間。其中,任務(wù)執(zhí)行時(shí)間可以通過(guò)WindowsAPI函數(shù)getTickCount()來(lái)分別得到任務(wù)進(jìn)入線程池與離開(kāi)線程池時(shí)的CPU時(shí)鐘,從而做差就可以求出任務(wù)執(zhí)行時(shí)間;而任務(wù)運(yùn)算時(shí)間也可以得到,因此再將兩者做差就可以得出最后的任務(wù)阻塞時(shí)間。具體做法同監(jiān)測(cè)任務(wù)運(yùn)算時(shí)間時(shí)的做法,只是改變了監(jiān)測(cè)的API函數(shù)。
四、支持向量機(jī)調(diào)優(yōu)模塊
根據(jù)支持向量機(jī)調(diào)優(yōu)模型,將支持向量機(jī)調(diào)優(yōu)模塊寫成線程類中的一個(gè)函數(shù)——調(diào)優(yōu)函數(shù)Tuning()。
通過(guò)線程池類內(nèi)的成員變量m_tuntu、m_cmptm和m_blktm獲取當(dāng)前線程池性能數(shù)據(jù),輸入到支持向量機(jī)方法中得到最佳線程池尺寸。當(dāng)最佳線程池尺寸與當(dāng)前線程池尺寸不符時(shí),需要對(duì)線程池的尺寸進(jìn)行調(diào)整。當(dāng)需要增加線程池尺寸時(shí),可以通過(guò)WindowsAPI函數(shù)CreateThread()來(lái)創(chuàng)建新線程;當(dāng)需要減小線程池尺寸時(shí),可以通過(guò)調(diào)用函數(shù)TerminateThread()來(lái)銷毀空閑線程,最終達(dá)到所需的最佳線程池尺寸。
【參考文獻(xiàn)】
[1]董如意.基于二階段法的新型凸殼支持向量機(jī)研究[J].現(xiàn)代交際,2012(11).
責(zé)任編輯:張麗