青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

管理處理器的親和性(affinity)

轉載自:http://www.ibm.com/developerworks/cn/linux/l-affinity.html


簡單地說,CPU 親和性(affinity) 就是進程要在某個給定的 CPU 上盡量長時間地運行而不被遷移到其他處理器的傾向性。Linux 內核進程調度器天生就具有被稱為 軟 CPU 親和性(affinity) 的特性,這意味著進程通常不會在處理器之間頻繁遷移。這種狀態正是我們希望的,因為進程遷移的頻率小就意味著產生的負載小。

2.6 版本的 Linux 內核還包含了一種機制,它讓開發人員可以編程實現 硬 CPU 親和性(affinity)。這意味著應用程序可以顯式地指定進程在哪個(或哪些)處理器上運行。

什么是 Linux 內核硬親和性(affinity)?

在 Linux 內核中,所有的進程都有一個相關的數據結構,稱為 task_struct。這個結構非常重要,原因有很多;其中與 親和性(affinity)相關度最高的是 cpus_allowed 位掩碼。這個位掩碼由 n 位組成,與系統中的 n 個邏輯處理器一一對應。 具有 4 個物理 CPU 的系統可以有 4 位。如果這些 CPU 都啟用了超線程,那么這個系統就有一個 8 位的位掩碼。

如果為給定的進程設置了給定的位,那么這個進程就可以在相關的 CPU 上運行。因此,如果一個進程可以在任何 CPU 上運行,并且能夠根據需要在處理器之間進行遷移,那么位掩碼就全是 1。實際上,這就是 Linux 中進程的缺省狀態。

Linux 內核 API 提供了一些方法,讓用戶可以修改位掩碼或查看當前的位掩碼:

  • sched_set_affinity() (用來修改位掩碼)
  • sched_get_affinity() (用來查看當前的位掩碼)

注意,cpu_affinity 會被傳遞給子線程,因此應該適當地調用 sched_set_affinity

為什么應該使用硬親和性(affinity)?

通常 Linux 內核都可以很好地對進程進行調度,在應該運行的地方運行進程(這就是說,在可用的處理器上運行并獲得很好的整體性能)。內核包含了一些用來檢測 CPU 之間任務負載遷移的算法,可以啟用進程遷移來降低繁忙的處理器的壓力。

一般情況下,在應用程序中只需使用缺省的調度器行為。然而,您可能會希望修改這些缺省行為以實現性能的優化。讓我們來看一下使用硬親和性(affinity) 的 3 個原因。

原因 1. 有大量計算要做

基于大量計算的情形通常出現在科學和理論計算中,但是通用領域的計算也可能出現這種情況。一個常見的標志是您發現自己的應用程序要在多處理器的機器上花費大量的計算時間。

原因 2. 您在測試復雜的應用程序

測試復雜軟件是我們對內核的親和性(affinity)技術感興趣的另外一個原因。考慮一個需要進行線性可伸縮性測試的應用程序。有些產品聲明可以在 使用更多硬件 時執行得更好。

我們不用購買多臺機器(為每種處理器配置都購買一臺機器),而是可以:

  • 購買一臺多處理器的機器
  • 不斷增加分配的處理器
  • 測量每秒的事務數
  • 評估結果的可伸縮性

如果應用程序隨著 CPU 的增加可以線性地伸縮,那么每秒事務數和 CPU 個數之間應該會是線性的關系(例如斜線圖 —— 請參閱下一節的內容)。這樣建模可以確定應用程序是否可以有效地使用底層硬件。

Amdahl 法則

Amdahl 法則是有關使用并行處理器來解決問題相對于只使用一個串行處理器來解決問題的加速比的法則。加速比(Speedup) 等于串行執行(只使用一個處理器)的時間除以程序并行執行(使用多個處理器)的時間:

      T(1)
            S = ------
            T(j)
            

其中 T(j) 是在使用 j 個處理器執行程序時所花費的時間。

Amdahl 法則說明這種加速比在現實中可能并不會發生,但是可以非常接近于該值。對于通常情況來說,我們可以推論出每個程序都有一些串行的組件。隨著問題集不斷變大,串行組件最終會在優化解決方案時間方面達到一個上限。

Amdahl 法則在希望保持高 CPU 緩存命中率時尤其重要。如果一個給定的進程遷移到其他地方去了,那么它就失去了利用 CPU 緩存的優勢。實際上,如果正在使用的 CPU 需要為自己緩存一些特殊的數據,那么所有其他 CPU 都會使這些數據在自己的緩存中失效。

因此,如果有多個線程都需要相同的數據,那么將這些線程綁定到一個特定的 CPU 上是非常有意義的,這樣就確保它們可以訪問相同的緩存數據(或者至少可以提高緩存的命中率)。否則,這些線程可能會在不同的 CPU 上執行,這樣會頻繁地使其他緩存項失效。

原因 3. 您正在運行時間敏感的、決定性的進程

我們對 CPU 親和性(affinity)感興趣的最后一個原因是實時(對時間敏感的)進程。例如,您可能會希望使用硬親和性(affinity)來指定一個 8 路主機上的某個處理器,而同時允許其他 7 個處理器處理所有普通的系統調度。這種做法確保長時間運行、對時間敏感的應用程序可以得到運行,同時可以允許其他應用程序獨占其余的計算資源。

下面的樣例應用程序顯示了這是如何工作的。

如何利用硬親和性(affinity)

現在讓我們來設計一個程序,它可以讓 Linux 系統非常繁忙。可以使用前面介紹的系統調用和另外一些用來說明系統中有多少處理器的 API 來構建這個應用程序。實際上,我們的目標是編寫這樣一個程序:它可以讓系統中的每個處理器都繁忙幾秒鐘。可以從后面的“下載”一節中 下載樣例程序


清單 1. 讓處理器繁忙
            /* This method will create threads, then bind each to its own cpu. */
            bool do_cpu_stress(int numthreads)
            {
            int ret = TRUE;
            int created_thread = 0;
            /* We need a thread for each cpu we have... */
            while ( created_thread < numthreads - 1 )
            {
            int mypid = fork();
            if (mypid == 0) /* Child process */
            {
            printf("\tCreating Child Thread: #%i\n", created_thread);
            break;
            }
            else /* Only parent executes this */
            {
            /* Continue looping until we spawned enough threads! */ ;
            created_thread++;
            }
            }
            /* NOTE: All threads execute code from here down! */
            

正如您可以看到的一樣,這段代碼只是通過 fork 調用簡單地創建一組線程。每個線程都執行這個方法中后面的代碼。現在我們讓每個線程都將親和性(affinity)設置為自己的 CPU。


清單 2. 為每個線程設置 CPU 親和性(affinity)
            cpu_set_t mask;
            /* CPU_ZERO initializes all the bits in the mask to zero. */
            CPU_ZERO( &mask );
            /* CPU_SET sets only the bit corresponding to cpu. */
            CPU_SET( created_thread, &mask );
            /* sched_setaffinity returns 0 in success */
            if( sched_setaffinity( 0, sizeof(mask), &mask ) == -1 )
            {
            printf("WARNING: Could not set CPU Affinity, continuing...\n");
            }
            

如果程序可以執行到這兒,那么我們的線程就已經設置了自己的親和性(affinity)。調用 sched_setaffinity 會設置由 pid 所引用的進程的 CPU 親和性(affinity)掩碼。如果 pid 為 0,那么就使用當前進程。

親和性(affinity)掩碼是使用在 mask 中存儲的位掩碼來表示的。最低位對應于系統中的第一個邏輯處理器,而最高位則對應于系統中最后一個邏輯處理器。

每個設置的位都對應一個可以合法調度的 CPU,而未設置的位則對應一個不可調度的 CPU。換而言之,進程都被綁定了,只能在那些對應位被設置了的處理器上運行。通常,掩碼中的所有位都被置位了。這些線程的親和性(affinity)都會傳遞給從它們派生的子進程中。

注意不應該直接修改位掩碼。應該使用下面的宏。雖然在我們的例子中并沒有全部使用這些宏,但是在本文中還是詳細列出了這些宏,您在自己的程序中可能需要這些宏。


清單 3. 間接修改位掩碼的宏
            void CPU_ZERO (cpu_set_t *set)
            這個宏對 CPU 集 set 進行初始化,將其設置為空集。
            void CPU_SET (int cpu, cpu_set_t *set)
            這個宏將 cpu 加入 CPU 集 set 中。
            void CPU_CLR (int cpu, cpu_set_t *set)
            這個宏將 cpu 從 CPU 集 set 中刪除。
            int CPU_ISSET (int cpu, const cpu_set_t *set)
            如果 cpu 是 CPU 集 set 的一員,這個宏就返回一個非零值(true),否則就返回零(false)。
            

對于本文來說,樣例代碼會繼續讓每個線程都執行某些計算量較大的操作。


清單 4. 每個線程都執行一個計算敏感的操作
            /* Now we have a single thread bound to each cpu on the system */
            int computation_res = do_cpu_expensive_op(41);
            cpu_set_t mycpuid;
            sched_getaffinity(0, sizeof(mycpuid), &mycpuid);
            if ( check_cpu_expensive_op(computation_res) )
            {
            printf("SUCCESS: Thread completed, and PASSED integrity check!\n",
            mycpuid);
            ret = TRUE;
            }
            else
            {
            printf("FAILURE: Thread failed integrity check!\n",
            mycpuid);
            ret = FALSE;
            }
            return ret;
            }
            

現在您已經了解了在 Linux 2.6 版本的內核中設置 CPU 親和性(affinity)的基本知識。接下來,我們使用一個 main 程序來封裝這些方法,它使用一個用戶指定的參數來說明要讓多少個 CPU 繁忙。我們可以使用另外一個方法來確定系統中有多少個處理器:

int NUM_PROCS = sysconf(_SC_NPROCESSORS_CONF);

這個方法讓程序能夠自己確定要讓多少個處理器保持繁忙,例如缺省讓所有的處理器都處于繁忙狀態,并允許用戶指定系統中實際處理器范圍的一個子集。

運行樣例程序

當運行前面介紹的 樣例程序 時,可以使用很多工具來查看 CPU 是否是繁忙的。如果只是簡單地進行測試,可以使用 Linux 命令top。在運行 top 命令時按下 “1” 鍵,可以看到每個 CPU 執行進程所占用的百分比。

結束語

這個樣例程序雖然非常簡單,但是它卻展示了使用 Linux 內核中實現的硬親和性(affinity)的基本知識。(任何使用這段代碼的應用程序都無疑會做一些更有意義的事情。)了解了 CPU 親和性(affinity)內核 API 的基本知識,您就可以從復雜的應用程序中榨取出最后一點兒性能了。


下載

描述 名字 大小 下載方法
Sample app using CPU affinity kernel API thrasher.zip 3 KB FTP

關于下載方法的信息


參考資料

學習

獲得產品和技術

討論

關于作者

Eli Dow 是位于 Poughkeepsie, NY. 的 IBM Linux Test and Integration Center 的一名軟件工程師。他擁有 Clarkson 大學的計算機科學和心理學學士學位,以及計算機科學碩士學位。他的興趣包括 GNOME 桌面、人與計算機的交互以及 Linux 系統編程。您可以通過emdow@us.ibm.com 與 Eli 聯系。


posted on 2010-11-01 03:05 楊粼波 閱讀(911) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品视频啊美女在线直播| 亚洲特级毛片| 亚洲一区二区视频在线| 欧美 日韩 国产 一区| 欧美资源在线观看| 亚洲欧美日韩第一区| 99精品国产一区二区青青牛奶| 欧美国产视频日韩| 亚洲人www| 日韩视频专区| 欧美一区二区三区久久精品| 久久精品在线播放| 欧美日本国产精品| 韩国三级电影一区二区| 亚洲国产精品va在线看黑人 | 欧美大片在线看| 国产精品一区毛片| 亚洲精品国产精品乱码不99按摩 | 欧美大片一区| 一区二区三区www| 久久精品国产亚洲a| 欧美日韩成人| 亚洲精品麻豆| 欧美国产精品日韩| 久久久久国产一区二区| 国产精品久久久久久久午夜| 99ri日韩精品视频| 美女主播一区| 久久人人爽人人爽爽久久| 国产精品久久久久毛片大屁完整版 | 亚洲伊人伊色伊影伊综合网| 狂野欧美激情性xxxx| 国产日韩欧美夫妻视频在线观看| 一本色道久久加勒比88综合| 免费高清在线一区| 美女视频网站黄色亚洲| 一区二区在线视频| 欧美成年人视频网站欧美| 久热国产精品| av成人激情| 午夜精品999| 国产一区二区三区观看| 欧美成人精品1314www| 久久久久成人精品| 在线成人免费观看| 一区二区精品| 樱桃成人精品视频在线播放| 亚洲黄网站黄| 国产欧美大片| 欧美激情视频在线播放| 国产精品va在线| 久久久国产91| 欧美精品午夜视频| 噜噜噜噜噜久久久久久91 | 欧美中文在线视频| 亚洲精品午夜精品| 午夜激情久久久| 亚洲一区在线免费观看| 亚洲你懂的在线视频| 亚洲国产婷婷香蕉久久久久久99 | 亚洲欧美在线磁力| 久久久久久久久久码影片| 在线视频欧美日韩精品| 久久国产日本精品| 香蕉久久夜色精品国产使用方法| 欧美在线观看视频一区二区| 亚洲网站在线播放| 久久综合色88| 免播放器亚洲一区| 国产情人综合久久777777| 日韩一级大片在线| 亚洲视频自拍偷拍| 欧美日韩性生活视频| 欧美不卡视频| 一本久道久久综合狠狠爱| 久久久99爱| 久久永久免费| 1024国产精品| 欧美三级午夜理伦三级中视频| 亚洲国产高清aⅴ视频| 亚洲国产精品一区二区三区| 欧美黄色网络| 亚洲欧美日韩一区二区三区在线| 一区二区三区久久网| 欧美日韩精品一区二区三区| 亚洲午夜精品一区二区三区他趣| 午夜日韩激情| …久久精品99久久香蕉国产| 欧美精品一区二区高清在线观看| 国产香蕉久久精品综合网| 免费成人av在线| 亚洲欧美电影在线观看| 欧美mv日韩mv国产网站app| 亚洲国产日韩欧美在线图片| 亚洲国产精品va在线看黑人动漫| 亚洲国产精品黑人久久久| 国产精品福利在线观看网址| 久久夜色精品国产欧美乱| 激情综合视频| 久久久99国产精品免费| 久久五月婷婷丁香社区| 久久免费国产精品| 欧美日韩四区| 久久久中精品2020中文| 亚洲精品乱码| 亚洲高清自拍| 亚洲六月丁香色婷婷综合久久| 美女网站久久| 久久欧美中文字幕| 久久久久这里只有精品| 午夜一区不卡| 亚洲影院色无极综合| 一本高清dvd不卡在线观看| 亚洲成色999久久网站| 国产精品爽黄69| 国产区亚洲区欧美区| 国产一区二区毛片| 亚洲一区二区三区国产| 国产精品呻吟| 91久久中文| 久久国产视频网站| 最新日韩中文字幕| 久久人人97超碰精品888| 欧美日韩中字| 国产精品一区二区你懂的| 亚洲国产精品免费| 亚洲免费视频观看| 久久9热精品视频| 亚洲高清不卡一区| 亚洲一级在线| 欧美日韩国产一级| 一区二区三区在线免费播放| 亚洲无限av看| 亚洲欧洲精品一区二区| 久久国产精品一区二区三区四区 | 亚洲午夜久久久| 欧美日本在线看| 国产亚洲欧美日韩日本| 欧美激情麻豆| 国产香蕉97碰碰久久人人| 久久激情一区| 欧美激情中文不卡| 久久激情五月丁香伊人| 你懂的视频一区二区| 亚洲黄页一区| 亚洲区在线播放| 欧美日韩国产美女| 欧美亚洲自偷自偷| 久久国产精品99国产精| 国产精品视频精品视频| 亚洲综合成人婷婷小说| 亚洲视频1区2区| 国产欧美一区二区三区国产幕精品 | 欧美在线黄色| 香蕉免费一区二区三区在线观看| 国产精品一区二区久久久| 久久视频这里只有精品| 欧美极品aⅴ影院| 久久成人精品视频| 亚洲一区二区高清视频| 海角社区69精品视频| 99视频一区二区| 亚洲第一页中文字幕| 亚洲欧美国产一区二区三区| 日韩香蕉视频| 久久国产精品72免费观看| 夜夜嗨av一区二区三区四季av| 亚洲欧美成人精品| 一区二区三区av| 久久影院午夜论| 亚洲影院色无极综合| 久久综合精品国产一区二区三区| 亚洲精品视频啊美女在线直播| 亚洲欧洲日韩女同| 亚洲精品乱码久久久久久黑人 | 久久精品99久久香蕉国产色戒| 久久精品成人| 久久综合精品国产一区二区三区| 国产精品久久久久高潮| 亚洲午夜精品网| 久久精品国内一区二区三区| 国产一区二区三区四区hd| 久久久激情视频| 亚洲人成网站影音先锋播放| 午夜精品久久久久久| 国产日韩一区| 欧美激情一区二区在线| 亚洲综合丁香| 亚洲国产欧美一区二区三区久久| 永久91嫩草亚洲精品人人| 一区二区三区精品国产| 在线视频精品一区| 欧美大色视频| 亚洲美女诱惑| 亚洲曰本av电影| 国产精品入口日韩视频大尺度| 一区二区三区高清不卡| 亚洲综合国产精品| 国产一区二区精品| 久久久久久久尹人综合网亚洲 |