2016-07-25 91 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) –