Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当虚拟内存使用达到256gb时,进程输入接口停止响应_C_Linux_Multithreading_Sockets_Memory - Fatal编程技术网

C 当虚拟内存使用达到256gb时,进程输入接口停止响应

C 当虚拟内存使用达到256gb时,进程输入接口停止响应,c,linux,multithreading,sockets,memory,C,Linux,Multithreading,Sockets,Memory,我想知道的是,当虚拟内存大小达到256gb时,多线程应用程序进程会在TCP套接字、udp套接字或串行接口上生成几个核心线程来处理请求接收 每次长时间运行二进制文件时都会发生这种情况 顶部命令输出- top - 11:14:15 up 3 days, 5:47, 8 users, load average: 0.43, 0.47, 0.47 Threads: 9 total, 0 running, 9 sleeping, 0 stopped, 0 zombie %Cpu(

我想知道的是,当虚拟内存大小达到256gb时,多线程应用程序进程会在TCP套接字、udp套接字或串行接口上生成几个核心线程来处理请求接收

每次长时间运行二进制文件时都会发生这种情况

顶部命令输出-

top - 11:14:15 up 3 days,  5:47,  8 users,  load average: 0.43, 0.47, 0.47
Threads:   9 total,   0 running,   9 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us, 15.7 sy,  0.0 ni, 83.7 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   3972884 total,  2745296 used,  1227588 free,   117920 buffers
KiB Swap:        0 total,        0 used,        0 free,  1344768 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
10745 root      20   0  256g 529m 2348 S  14.6 13.6  67:28.74 obcs
10371 root      20   0  256g 529m 2348 S   0.0 13.6   0:01.32 obcs
10373 root      20   0  256g 529m 2348 S   0.0 13.6   1:21.92 obcs
10707 root      20   0  256g 529m 2348 S   0.0 13.6   0:00.00 obcs
10740 root      20   0  256g 529m 2348 S   0.0 13.6   0:00.04 obcs
10741 root      20   0  256g 529m 2348 S   0.0 13.6   0:00.86 obcs
10742 root      20   0  256g 529m 2348 S   0.0 13.6   0:17.00 obcs
10743 root      20   0  256g 529m 2348 S   0.0 13.6   0:00.00 obcs
10744 root      20   0  256g 529m 2348 S   0.0 13.6   0:01.26 obcs
此外,一旦出现pthread create失败,并出现错误-[无法分配内存],该错误用于处理任何请求&此后,在日志中看不到新的线程创建请求

操作系统版本-Debian 3.16.7-ckt4-3~bpo70+1(2015-02-12)x86_64 GNU/Linux

如果存在此内存泄漏问题,则top命令输出上的内存消耗会不断增加

root@Moxa:~# cat /proc/sys/vm/overcommit_memory
0

root@Moxa:~# cat /proc/5518/maps
00400000-0046c000 r-xp 00000000 08:01 276281                             /opt/obcs/bin/obcs
0066b000-0066c000 r--p 0006b000 08:01 276281                             /opt/obcs/bin/obcs
0066c000-0066e000 rw-p 0006c000 08:01 276281                             /opt/obcs/bin/obcs
0066e000-00672000 rw-p 00000000 00:00 0
015de000-0161f000 rw-p 00000000 00:00 0                                  [heap]
7fa2af35a000-7fa2af35b000 ---p 00000000 00:00 0
7fa2af35b000-7fa2afb5b000 rw-p 00000000 00:00 0

.......huge number of entry
或者这是内核配置设置问题

例如,如果我运行以下源代码-

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>


void *thread_func(void *arg);

int main(int argc, char **argv)
{
  int s,i=0;
  void *res;
  pthread_t t1[100];

  printf("In Main()\n");
  sleep(20);
  while (i < 100) {
    s = pthread_create(&t1[i], NULL, thread_func, "Hello World\n");

    if (s != 0)
      printf("Err\n");


    usleep (600000);

    i++;
  }
 i=0;
 while (i < 100) {
   //s = pthread_detach(t1);
   s = pthread_join(t1[i],NULL);
   if (s != 0)
     printf("Err\n");
   i++;
 }
  sleep (60);
  return 0;
}

void *thread_func(void *arg)
{
  char *s = (char *)arg;
  char *ptr = (char *)malloc(sizeof(char)*2048);
  memset(ptr,'s',2048);
  printf("%s", s);

  sleep(5);
/* printf("%s",ptr); */
  free(ptr);
  pthread_exit(0);
}
当只有主线程在开始时才运行虚拟内存时,驻留内存消耗6328和380,然后子线程开始执行,所以虚拟内存和驻留内存再次增加,但当所有线程都完成其执行后,虚拟内存和驻留内存消耗应该接近6328和380,但它是552m 836

现在我找到了解决办法。 为了使线程可分离,我们应该在创建线程之前使用pthread_attr_setdetachstate()函数来设置属性pthread_CREATE_DETACHED,而不是在创建线程之后使用pthread_detache()函数

解决方案-

rc = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
rc = pthread_create(&thread1, &attr, testFunction, NULL);
而不是-

 s = pthread_create(&t1[i], NULL, thread_func, "Hello World\n");
 s = pthread_detach(t1[i]);

此解决方案适合我。感谢您的讨论。

[无法分配内存]
您显然没有释放分配的内存,并且耗尽了所有可用资源。我们需要先查看代码,然后才能确定它是设计问题、泄漏还是其他问题……“这是内存泄漏问题吗”…“当虚拟内存大小达到256gb时”。你必须问一下?显然这是一个内存泄漏问题。你有4GB的物理内存,你有n个进程,每个进程使用256Gb的虚拟内存。我想知道整个机器是如何处理它的。所以你的虚拟地址空间用完了,或者遇到了其他一些限制,你的进程不能创建更多的线程,事情自然就不起作用了。是的,您在某个地方有漏洞,可能是您没有正确地处理正在创建的线程,或者没有首先控制创建的线程数量。
 s = pthread_create(&t1[i], NULL, thread_func, "Hello World\n");
 s = pthread_detach(t1[i]);