2016-07-25 87 views
-1

我有一個非常耗費資源的代碼,所以我可以將工作負載分割爲多個pthread。儘管一切正常,但計算速度更快等。我猜測發生的情況是該處理器內核上的其他進程變得非常緩慢,以至於在運行幾秒後它們會崩潰。資源密集型多線程查殺其他進程

我已經設法殺掉Chrome選項卡,Cinnamon DE甚至整個OS(內核?)等隨機進程。

代碼:(它很晚了,我太累了,不能做一個僞代碼,甚至評論..) - 但它是一個暴力破解代碼,而不是破解,但測試密碼和或CPU IPS。

任何想法如何解決這個問題,同時仍然保持儘可能多的性能?

static unsigned int NTHREADS = std::thread::hardware_concurrency(); 
static int   THREAD_COMPLETE = -1; 
static std::string PASSWORD = ""; 
static std::string CHARS; 
static std::mutex  MUTEX; 

void *find_seq(void *arg_0) 
{ 
    unsigned int _arg_0 = *((unsigned int *) arg_0); 
    std::string *str_CURRENT = new std::string(" "); 

    while (true) 
    { 
    for (unsigned int loop_0 = _arg_0; loop_0 < CHARS.length() - 1; loop_0 += NTHREADS) 
    { 
     str_CURRENT->back() = CHARS[loop_0]; 

     if (*str_CURRENT == PASSWORD) 
     { 
     THREAD_COMPLETE = _arg_0; 
     return (void *) str_CURRENT; 
     } 
    } 

    str_CURRENT->back() = CHARS.back(); 

    for (int loop_1 = (str_CURRENT->length() - 1); loop_1 >= 0; loop_1--) 
    { 
     if (str_CURRENT->at(loop_1) == CHARS.back()) 
     { 
     if (loop_1 == 0) 
      str_CURRENT->assign(str_CURRENT->length() + 1, CHARS.front()); 
     else 
     { 
      str_CURRENT->at(loop_1) =  CHARS.front(); 
      str_CURRENT->at(loop_1 - 1) = CHARS[CHARS.find(str_CURRENT->at(loop_1 - 1)) + 1]; 
     } 
     } 
    } 
    }; 
} 
+2

您所描述的症狀是那些內存不足的情況引起的內存或資源泄漏,調用[OOM殺手(https://開頭WWW .memset.com/docs/additional-information/oom-killer /) – kfsone

+0

@kfsone聽起來很可能,但應用程序最多使用20MB,而Valgrind報告如下:可能丟失:14個塊中的2,223字節&&仍然可達:56字節在7個街區。當然,我會嘗試解決一些泄漏問題,但有時Valgrind會提供無害的數據。 – areuz

+1

一個耗費CPU的進程不應該會導致其他進程崩潰。它會降低速度,但由於硬件故障或內核錯誤,只能使它們崩潰。 –

回答

0

謝謝您的解答,特別是馬修·費舍爾,他建議,嘗試在另一個系統上。


一些試驗和錯誤,我決定給拉了回來,我以爲是我的穩定超頻CPU後(我是有一年多了),而且解決了這個怪異的行爲。我想我從來沒有運行這樣的CPU密集型和(我猜測)有效率(關於不通過屈服來限制整個CPU)腳本來看到這種情況發生。

馬修建議,我需要拿出一個更好的辦法,而不是隻是不斷地用while true循環檢查THREAD_COMPLETE變量,但我希望能解決的意見。

全部併爲未來的遊客更新的代碼是在這裏:pastebin.com/jbiYyKBu

1

Areuz,

你能發佈完整的代碼?我懷疑這個問題是NTHREADS的價值。在我的Ubuntu盒子上,值被設置爲8,這是/ proc/cpuinfo文件中的核心數量。在我的盒子上開啓8個「熱」線程,使100%的CPU都可以使用。內核將爲其自己的關鍵進程劃分時間片,但通常所有其他進程都會因CPU而捱餓。

查看/ etc/cpuinfo中的最大處理器值,然後至少一個低於那個值。 CPU的編號是0-7,所以7對我來說是最大的。實際的最大值可能是3,因爲我的4個核心是超線程。對於完全的CPU進程,超線程通常不起作用。底線,不要佔用所有的CPU,它會使系統不穩定。

--Matt

+0

我有一個i7 3770K @ 4.8GHz。它有8個線程。我顯然試圖使用所有的線程來提高性能。我只是想知道爲什麼像'壓力'命令可以使用所有的CPU而不會崩潰任何東西。 P.S.即使我只使用了幾個線程,正如我所述,正在這些線程上運行的進程,我的某些Chrome選項卡等大部分時間都會隨着時間的推移而崩潰。 完整代碼,僅供參考:http://pastebin.com/jbiYyKBu – areuz

+0

我決定看一下'壓力'源代碼,現在我更加困惑。我可以整天用整個CPU來強調整個CPU,所以我期待某種複雜的代碼,睡一會兒,或者降低優先級。但是用這個命令強調cpu的文字代碼是: 'hogcpu(void) { while(1) sqrt(rand()); return 0; }' – areuz

+0

嗯,沒有快樂。我在本地運行代碼沒有問題。它超出了我的8個核心,但盒子仍然運作良好。我跑了20分鐘沒有問題。 Ubuntu 14.04。你可以試試另一個盒子嗎? AWS擁​​有免費賬戶。 作爲一個小問題,main中的while循環使用另一個核心運行熱點。 pthread_join可用於監視線程是否退出。 THREAD_COMPLETE可以用作線程退出的標誌而不是(1) –