Theory:
In OS with below kernel parameters:vm.overcommit_memory = 2 vm.overcommit_ratio = 50which means, OS will at most allocate virtual memory to: SWAP size +50% RAM size.
For example, if OS has 48G RAM with 48G SWAP as shown below:
[root]# free total used free shared buffers cached Mem: 49316552 841556 48474996 0 150432 466384 -/+ buffers/cache: 224740 49091812 Swap: 50307508 0 50307508Which means, OS will at most allocate 48G+50%*48G = 72G virtual memory.
Experiment:
Let's do a simple test to prove that.1. Prepare "mem.c" C program which can allocate memory using function malloc:
#include <stdio.h> #include <stdlib.h> int main(){ int *ptr; unsigned long i,n; printf("Enter number of int(4 byte) you want to allocate:"); scanf("%lu",&n); printf("Allocating %lu bytes......\n",n*sizeof(int)); ptr=(int*)malloc(n*sizeof(int)); if (ptr==NULL){ printf("ERROR!Memory not allocated!"); exit(0); } printf("Filling int into memory.....\n"); for (i = 0; i < n; i++){ ptr[i] = 1; } printf("Sleep 10 seconds......\n"); sleep(10); printf("Free memory.\n"); free(ptr); return 0; }2. Compile it:
gcc mem.c -o mem3. If allocating 40G memory, all of them are from RAM.
[root]# ./mem Enter number of int(4 byte) you want to allocate:10000000000 Allocating 40000000000 bytes...... Filling int into memory..... Sleep 10 seconds...... Free memory.Before :
[root]# free total used free shared buffers cached Mem: 49316552 841556 48474996 0 150432 466384 -/+ buffers/cache: 224740 49091812 Swap: 50307508 0 50307508After :
[root]# free total used free shared buffers cached Mem: 49316552 39978952 9337600 0 150432 466408 -/+ buffers/cache: 39362112 9954440 Swap: 50307508 0 503075084. If allocating 72G memory, 50% SWAP and all RAM are used up.
Note, previously we mentioned that the total virtual memory size is SWAP size +50% RAM size, that is only for calculating the size. In fact, RAM is firstly used before starting to use SWAP.
[root]# ./mem Enter number of int(4 byte) you want to allocate:18000000000 Allocating 72000000000 bytes...... Filling int into memory..... Sleep 10 seconds...... Free memory.After:
[root]# free total used free shared buffers cached Mem: 49316552 49179688 136864 0 700 21856 -/+ buffers/cache: 49157132 159420 Swap: 50307508 21593608 287139005. If allocating 80G memory,OOM killer shows up.
[root]# ./mem Enter number of int(4 byte) you want to allocate:20000000000 Allocating 80000000000 bytes...... ERROR!Memory not allocated!
So one suggestion after adding more physical memory, is to add more SWAP also.
thanks for the scripts
ReplyDeleteB0C8809860
ReplyDeletekiralık hacker
hacker arıyorum
belek
kadriye
serik