C 当虚拟内存使用达到256gb时,进程输入接口停止响应
我想知道的是,当虚拟内存大小达到256gb时,多线程应用程序进程会在TCP套接字、udp套接字或串行接口上生成几个核心线程来处理请求接收 每次长时间运行二进制文件时都会发生这种情况 顶部命令输出-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(
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]);