Linux是這樣洩露記憶體的:Linux記憶體洩露過程觀察
今天寫了一個記憶體洩露程式,觀察系統記憶體的變化情況。
測試環境為:
[email protected]:/home/test# cat /etc/issue
Ubuntu 12.04 LTS \n \l
一、記憶體洩露程式碼
程式碼如下:
MemoryLeak.h
#ifndef MEMORYLEAK_H
#defineMEMORYLEAK_H
#include <iostream>
#include <unistd.h> //sleep
class MemoryLeak {
public:
MemoryLeak();
MemoryLeak(const MemoryLeak& orig);
int testLeak(const int block, const int count);
virtual ~MemoryLeak();
private:
};
#endif/* MEMORYLEAK_H */
MemoryLeak.cpp檔案
#include "MemoryLeak.h"
MemoryLeak::MemoryLeak() {
}
MemoryLeak::MemoryLeak(const MemoryLeak& orig) {
}
/*
*testLeak函式
*引數block表示每次洩露的記憶體塊大小,引數count 表示一共洩露多少次
*/
int MemoryLeak::testLeak(const int block, const int count){
int *p = 0;
long sum = 0;
for(int i=0; i<count; i++){
p = new int [block];
//注意:一定要賦值,否則沒有真正分配記憶體,而Java只要new後,就分記憶體,無需賦值。
for (int i=0; i<block; i++) {
p[i] = 1;
}
//std::cout<<sizeof(p)<<std::endl;
sum += 4*block;
std::cout<<"Allocated Memory is " << sum/(1024*1024)<<" MB" <<std::endl;
sleep(3);
}
MemoryLeak::~MemoryLeak() {
}
//如果忘了寫解構函式,在編譯時就會丟擲如下錯誤:
MemoryLeak.cpp:(.text+0x29): undefined reference to `vtable for MemoryLeak'
int main(int argc, char** argv) {
MemoryLeak *memoryLeak = new MemoryLeak();
memoryLeak->testLeak(10*1024*1024,100); //引數可以改
return 0;
}
上述程式碼每3秒,洩露40MB記憶體
二、監控
1、洩露程序監控
可以使用下列指令碼檢視改程序引起的記憶體變化:
#!/bin/bash
while [ 1 ]
do
cat /proc/1693/status |grep VmRSS >> /tmp/1693perf
sleep 3
done
nohup ./1693perf 2>&1 &
其中,1693為記憶體洩露程式碼的程序號
2、系統整體狀況監測
用下列命令觀察系統記憶體變化過程
[email protected]:/home/zhxue# vmstat 2 -S MB
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 0 136 148 948 0 0 0 0 394 1581 55 46 0 0
1 0 0 136 148 949 0 0 10 0 294 1299 18 32 50 0
2 0 0 147 128 917 0 0 0 30 427 1442 28 58 15 0
1 0 0 147 128 917 0 0 0 0 278 1257 15 31 53 0
0 0 0 138 116 898 0 0 0 14 341 1261 29 48 23 0
0 0 0 138 116 898 0 0 0 8 298 1268 21 35 45 0
3 0 0 132 104 877 0 0 0 106 370 1194 31 60 9 0
1 0 0 144 100 870 0 0 0 38 311 1225 26 44 30 0
0 0 0 136 87 850 0 0 0 6 353 1349 38 50 12 0
0 0 0 136 87 850 0 0 0 4 276 1267 16 29 54 0
3 0 0 143 83 808 0 0 0 0 352 1420 30 49 21 0
3 0 0 143 83 808 0 0 0 20 283 1332 16 33 52 0
2 0 0 136 83 776 0 0 0 202 367 1423 26 45 29 0
3 0 0 120 83 776 0 0 0 0 297 1287 21 35 44 0
0 0 0 136 80 739 0 0 0 26 329 1366 23 40 37 0
7 0 0 116 80 732 0 0 0 8 322 1307 26 38 37 0
2 0 0 138 77 700 0 0 0 26 318 1247 22 36 42 0
2 0 0 131 74 671 0 0 0 28 332 1253 26 41 34 0
0 0 0 134 74 667 0 0 0 0 305 1293 20 36 45 0
1 0 0 133 74 629 0 0 0 14 349 1384 28 42 30 0
0 0 0 133 74 629 0 0 0 8 302 1274 17 33 51 0
1 0 0 136 74 587 0 0 0 0 344 1335 30 46 25 0
1 0 0 135 74 587 0 0 0 0 285 1251 16 29 55 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 157 74 526 0 0 0 6 346 1322 29 44 27 0
5 0 0 157 74 526 0 0 0 32 279 1291 19 30 51 0
14 0 0 117 74 526 0 0 0 0 338 1306 26 44 30 0
3 0 0 125 74 505 0 0 0 12 327 1361 27 40 32 1
0 0 0 147 74 456 0 0 0 4 332 1224 24 46 30 0
3 0 0 134 74 456 0 0 0 0 310 1292 18 36 46 0
0 0 0 136 73 428 0 0 0 6 323 1345 22 41 36 1
3 0 0 132 71 404 0 0 0 0 311 1253 26 35 39 0
1 0 0 139 70 389 0 0 40 4 313 1358 21 37 42 0
0 0 0 152 67 340 0 0 0 14 345 1362 27 42 30 0
0 0 0 151 67 340 0 0 0 0 296 1247 17 30 53 0
1 0 0 141 60 319 0 0 2 144 379 1366 31 43 27 0
0 0 0 141 60 319 0 0 0 6 299 1275 17 31 52 0
2 0 0 144 43 294 0 0 0 6 343 1434 23 46 32 0
1 0 0 144 43 294 0 0 0 0 288 1318 17 32 51 0
0 0 0 141 29 273 0 0 0 8 344 1285 31 49 20 0
0 0 0 141 29 273 0 0 0 0 284 1273 13 33 54 0
3 0 0 144 17 243 0 0 0 28 353 1408 27 52 22 0
2 0 0 138 17 243 0 0 70 20 306 1313 16 37 47 0
0 0 1 140 4 222 0 0 0 42 340 1446 26 48 26 0
2 0 1 119 4 222 0 0 0 0 300 1348 21 37 42 0
1 0 1 145 1 184 0 0 0 104 337 1342 25 45 30 0
3 0 1 112 1 184 0 0 200 18 359 1285 22 42 36 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 1 140 0 152 0 0 128 278 356 1424 20 52 27 0
3 0 1 109 0 148 0 0 0 22 313 1203 27 42 32 0
1 0 1 142 0 113 0 0 0 24 350 1239 26 64 10 0
3 0 1 113 0 107 0 0 1688 20 336 1194 33 46 19 1
0 0 8 135 0 89 0 0 0 3442 395 1355 22 51 26 1
5 0 23 111 0 89 0 0 0 7588 394 1346 25 49 26 0
1 0 38 130 0 87 0 0 0 7956 431 1335 16 50 34 0
2 0 58 112 0 87 0 0 0 10218 409 1351 28 51 21 0
0 0 74 129 0 86 0 0 70 7874 443 1362 17 50 32 0
9 0 95 112 0 85 0 0 0 11046 432 1290 25 57 18 0
0 0 110 129 0 84 0 0 0 7514 413 1373 19 46 34 1
3 0 127 107 0 84 0 0 32 8470 416 1276 29 55 16 0
2 0 147 129 0 84 0 0 46 10298 489 1452 25 62 13 0
2 0 165 108 0 84 0 0 0 9322 433 1325 28 53 19 0
1 0 184 129 0 82 0 0 0 9784 442 1403 19 49 32 0
2 0 202 108 0 83 0 0 118 9200 460 1374 27 53 20 0
0 0 221 129 0 81 0 0 16 9656 448 1397 18 52 30 1
2 0 238 107 0 81 0 0 0 8712 448 1318 28 54 17 0
1 0 258 128 0 80 0 0 360 10430 465 1402 20 55 25 1
4 0 281 111 0 81 0 0 198 11986 503 1400 26 59 15 0
0 0 296 127 0 80 0 0 32 7724 419 1384 21 48 31 0
2 0 319 110 0 80 0 0 16 11286 496 1452 28 63 9 0
2 0 336 128 0 79 0 0 48 9118 431 1422 20 48 32 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
4 0 359 111 0 79 0 0 32 11790 489 1332 35 57 8 0
1 0 375 127 0 78 0 0 48 7844 424 1393 19 50 31 0
4 0 399 111 0 78 0 0 50 12302 524 1469 29 61 10 0
1 0 414 127 0 78 0 0 80 7880 405 1386 16 48 36 1
4 0 441 114 0 78 0 0 96 13844 528 1393 27 63 10 0
3 0 469 120 0 78 0 0 13668 15358 881 1534 9 79 4 8
2 1 513 93 0 81 0 0 17136 22800 1022 1392 10 90 0 0
1 0 554 116 0 77 0 0 15280 24968 1028 1420 2 97 0 1
2 1 577 91 0 75 0 0 9468 16076 789 1276 21 78 0 1
0 0 605 120 0 73 0 0 224 14214 503 1421 17 62 21 0
3 0 619 94 0 74 0 0 532 7508 436 1319 28 51 21 0
2 0 644 120 0 73 0 0 0 12780 493 1429 22 61 17 0
2 0 658 94 0 73 0 0 16 7236 433 1354 29 49 22 0
0 0 683 120 0 72 0 0 16 12860 471 1454 21 55 24 0
3 0 698 94 0 72 0 0 0 7326 427 1302 27 49 23 0
1 0 709 120 0 71 0 0 8 5816 384 1374 18 44 38 0
3 0 720 100 0 71 0 0 10 5488 409 1265 30 49 21 0
0 0 734 121 0 70 0 0 24 7510 449 1468 22 52 26 1
5 0 746 105 0 70 0 0 50 5858 429 1389 30 52 18 0
5 0 754 121 0 69 0 0 90 4200 384 1385 18 43 38 1
2 0 765 97 0 68 0 0 124 6152 433 1318 31 55 14 0
2 0 789 121 0 66 0 0 172 12076 492 1408 22 61 16 0
5 1 800 90 0 68 0 0 754 5866 442 1360 30 53 16 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
3 0 825 116 0 66 0 0 268 13206 512 1448 16 61 22 1
4 0 840 91 0 66 0 0 292 7806 465 1372 24 56 19 0
1 0 865 116 0 66 0 0 268 12890 505 1422 18 58 23 1
2 0 880 91 0 66 0 0 224 7612 436 1313 26 54 20 1
1 0 905 116 0 65 0 0 102 13050 507 1453 21 60 19 0
4 0 920 91 0 65 0 0 232 7916 467 1404 26 56 18 0
3 0 944 116 0 65 0 0 172 12662 504 1438 20 59 20 1
2 0 957 88 0 65 0 0 190 6546 430 1288 29 50 20 1
2 0 984 113 0 66 0 0 2236 14190 648 1519 22 77 1 1
4 0 998 87 0 68 0 0 2744 7588 568 1634 36 62 2 0
1 0 1031 116 0 66 0 0 254 17140 567 1477 21 72 8 0
3 0 1036 92 0 66 0 0 132 2756 363 1307 23 44 34 0
0 0 1072 116 0 66 0 0 936 18542 620 1520 19 78 3 0
5 0 1076 94 0 70 0 0 4566 2534 435 1422 21 47 32 1
2 0 1109 111 0 69 0 0 242 16954 584 1458 25 75 0 0
3 0 1116 99 0 68 0 0 144 3626 376 1357 22 41 37 0
3 0 1151 115 0 68 0 0 172 18396 598 1553 28 72 0 0
3 0 1154 99 0 68 0 0 6648 2568 645 1594 24 61 13 2
2 0 1191 111 0 68 0 0 160 18964 624 1519 23 77 0 0
4 0 1204 116 0 68 0 0 2304 6836 539 1330 19 58 22 0
4 0 1234 113 0 68 0 0 166 15636 696 1445 27 74 0 0
2 0 1254 132 0 67 0 0 160 10076 627 1479 23 69 8 0
1 0 1277 121 1 67 0 0 150 12340 668 1457 31 69 0 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
3 0 1300 136 1 66 0 0 666 11798 637 1444 20 62 18 0
2 0 1323 129 0 65 0 0 162 12066 602 1267 26 74 0 0
3 0 1328 110 0 65 0 0 122 2684 387 1368 23 43 34 0
3 0 1364 130 0 65 0 0 152 18354 742 1573 22 78 0 0
5 0 1368 106 0 65 0 0 94 2280 380 1269 23 44 33 0
6 0 1400 127 0 65 0 0 86 16698 719 1443 24 76 0 0
6 1 1407 120 0 66 0 0 1864 3954 482 1220 31 57 13 0
3 0 1425 109 0 67 0 0 952 9872 481 1102 28 72 0 0
0 0 1440 125 0 66 0 0 22 7700 433 1303 24 58 17 0
2 0 1467 114 0 67 0 0 726 13810 567 1453 30 69 1 0
0 0 1475 122 0 66 0 0 156 3996 378 1381 18 42 39 0
2 0 1505 113 0 66 0 0 34 15876 568 1462 23 74 2 0
1 0 1513 121 0 66 0 0 316 4064 385 1404 18 46 36 1
4 1 1533 100 0 67 0 0 648 10458 502 1326 32 66 2 0
0 0 1552 119 0 66 0 0 144 9718 468 1383 27 61 13 0
4 0 1569 97 0 66 0 0 176 8978 478 1360 31 63 7 0
3 0 1591 118 0 66 0 0 300 11296 500 1366 19 65 16 1
4 0 1609 96 0 66 0 0 136 9220 470 1310 28 63 9 0
1 0 1629 116 0 66 0 0 196 10432 465 1349 19 63 17 1
3 0 1649 96 0 66 0 0 122 10332 480 1465 27 60 13 0
0 0 1667 107 0 74 0 0 4602 9872 561 1490 18 66 16 0
4 0 1684 88 0 72 0 0 104 8930 512 1198 27 61 12 1
2 0 1713 118 0 68 0 0 32 14752 675 1449 20 80 0 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
3 0 1729 97 0 68 0 0 8 8416 573 1360 28 68 4 1
4 0 1754 122 0 68 0 0 278 13164 629 1364 26 74 0 0
4 0 1776 108 0 67 0 0 66 11214 650 1351 29 71 0 0
1 0 1798 130 0 66 0 0 122 11542 616 1398 21 70 10 0
3 0 1805 97 0 67 0 0 98 3444 419 1339 27 45 27 0
0 0 1834 132 0 66 0 0 234 15356 771 1547 19 77 3 0
5 0 1839 98 0 67 0 0 1652 2748 455 1391 25 52 23 0
5 0 1872 129 0 67 0 0 2030 17098 720 1569 18 82 0 0
3 0 1886 105 0 67 0 0 216 7476 565 1413 32 61 8 0
0 0 1913 137 0 66 0 0 272 14258 772 1512 20 79 2 0
3 0 1913 128 2 71 0 0 4034 0 644 1578 27 52 20 1
5 0 1913 118 4 76 0 0 3606 0 613 1649 48 52 0 1
2 0 1267 1184 5 76 0 0 1926 8 586 1392 28 72 0 0
3 1 481 1676 6 80 0 0 11088 0 845 1436 19 74 0 7
1 0 474 1644 6 85 0 0 16374 14 1013 1718 13 72 0 14
1 0 471 1619 6 88 0 0 12704 20 889 1531 23 73 0 4
0 0 471 1618 6 88 0 0 522 32 175 466 3 7 90 1
1 0 471 1617 6 88 0 0 16 0 125 351 2 4 94 0
0 0 471 1617 6 88 0 0 0 10 133 339 2 4 94 0
0 0 471 1617 6 88 0 0 6 0 144 359 1 6 93 0
0 0 471 1617 6 88 0 0 0 0 146 342 2 5 93 0
4 0 471 1617 6 88 0 0 16 6 133 339 3 6 92 0
0 0 471 1617 6 88 0 0 0 0 134 320 1 5 94 0
可以看到,整個過程中,Cache不斷下降,當它達到80MB左右時,系統啟動了swap,swap不斷上漲,當swap快到2G時(Swap的分割槽大小),程式丟擲如下錯誤並退出,系統的free記憶體重回到1.6GB(總共2GB記憶體)
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
RUN FINISHED; Aborted; core dumped; real time: 5m 2s; user: 12s; system: 12s
檢視swap的大小:
[email protected]:/home/zhxue# swapon -s
FilenameType
SizeUsed
Priority
/dev/mapper/ubuntudev-swap_1 partition
2093052292520-1
http://blog.csdn.net/tianlesoftware/article/details/8741873
剛做完上次試驗後,再做了一次實驗:
[email protected]:/home/zhxue# vmstat 2 -S MB
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 281 1014 28 186 0 0 69 97 192 651 9 11 80 0
1 0 281 981 28 186 0 0 0 0 302 1311 22 32 46 0
0 0 281 941 28 186 0 0 0 0 305 1313 24 34 43 0
1 0 281 901 28 186 0 0 0 8 310 1348 23 37 40 0
1 0 281 861 28 186 0 0 0 14 306 1314 23 34 43 0
3 0 281 850 28 186 0 0 0 0 295 1333 18 30 52 0
0 0 281 821 28 186 0 0 0 20 312 1360 22 31 46 1
0 0 281 781 28 186 0 0 0 0 312 1388 23 34 42 0
0 0 281 741 28 186 0 0 0 0 318 1355 23 41 36 0
2 0 281 704 28 186 0 0 0 82 327 1305 23 38 40 0
0 0 281 701 28 186 0 0 0 0 278 1347 17 29 54 0
0 0 281 660 28 186 0 0 0 0 311 1300 27 31 42 0
0 0 281 620 28 186 0 0 0 16 304 1288 24 32 44 0
0 0 281 580 28 186 0 0 0 0 307 1343 22 35 43 0
1 0 281 540 28 186 0 0 0 8 317 1316 30 34 35 0
2 0 281 530 28 186 0 0 0 22 304 1322 18 29 53 0
1 0 281 500 28 186 0 0 0 48 323 1266 25 30 46 0
0 0 281 460 28 186 0 0 0 0 318 1318 24 32 44 0
0 0 281 420 28 186 0 0 0 10 328 1366 26 32 42 0
1 0 281 380 28 186 0 0 0 0 318 1324 25 30 46 0
1 0 281 340 28 186 0 0 0 0 311 1335 24 32 44 0
3 0 281 331 28 186 0 0 0 6 298 1289 18 30 52 0
1 0 281 300 28 186 0 0 0 0 311 1308 24 30 46 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
3 0 281 260 28 186 0 0 0 0 310 1355 26 32 42 0
2 0 281 220 28 186 0 0 0 38 321 1327 25 32 43 0
3 0 281 179 28 186 0 0 0 0 326 1378 26 32 42 0
3 0 281 143 28 186 0 0 0 0 308 1298 21 32 46 0
0 0 281 140 28 186 0 0 0 0 286 1329 15 28 56 0
1 0 281 132 24 156 0 0 0 6 356 1435 24 48 27 0
1 0 281 133 16 123 0 0 0 0 328 1389 24 42 34 0
3 0 281 108 14 114 0 0 0 2 330 1337 23 39 38 0
1 0 285 133 13 98 0 0 0 2264 456 1404 19 47 34 0
0 0 288 130 8 67 0 0 0 1230 400 1426 24 47 29 0
1 0 288 130 3 41 0 0 0 228 376 1427 20 54 25 0
4 0 288 114 3 40 0 0 0 6 301 1297 22 32 46 0
0 0 289 130 0 32 0 0 448 310 368 1479 20 54 27 0
0 0 292 128 0 31 0 0 148 1572 364 1473 26 50 24 0
4 0 302 98 0 31 0 0 38 5120 391 1429 25 45 30 1
1 0 330 127 0 31 0 0 64 14728 513 1505 18 52 30 0
4 0 369 125 0 31 0 0 564 19928 658 1550 24 77 0 0
3 0 389 105 0 31 0 0 16 10272 461 1421 24 53 22 0
6 0 413 106 0 35 0 0 2508 12076 570 1492 20 61 19 1
2 1 454 125 0 34 0 0 948 20976 730 1558 24 76 0 0
1 0 478 110 0 34 0 0 0 12606 553 1490 25 60 15 0
4 1 499 108 0 35 0 0 1384 10708 629 1422 22 63 15 0
4 1 522 108 0 39 0 0 4684 12364 617 1221 24 76 0 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
4 0 540 93 0 38 0 0 0 9016 478 1391 26 58 16 0
1 0 571 120 0 37 0 0 40 16080 529 1467 16 61 23 0
2 0 609 118 0 37 0 0 0 19406 604 1520 26 70 5 0
2 0 627 95 0 37 0 0 16 8914 448 1448 24 50 26 0
5 0 650 103 0 36 0 0 0 12024 466 1405 18 54 28 0
3 0 691 118 0 37 0 0 2896 20862 701 1507 20 80 0 0
4 0 713 101 0 37 0 0 0 11224 479 1456 24 57 19 0
5 0 733 97 0 38 0 0 6300 11502 645 1508 23 63 10 3
3 0 774 121 0 35 0 0 34 21394 749 1578 23 76 0 0
4 0 791 98 0 33 0 0 0 8718 513 1350 25 55 20 0
3 0 818 102 0 30 0 0 62 13854 698 1517 19 70 11 0
3 0 854 121 0 29 0 0 252 18222 687 1663 25 75 1 0
2 0 870 93 0 31 0 0 2614 8314 594 1537 23 63 14 0
4 0 901 104 0 26 0 0 0 15794 706 1473 21 69 10 0
1 0 937 122 0 26 0 0 158 18460 691 1512 20 72 8 1
1 0 968 114 0 26 0 0 0 15888 556 1480 25 65 10 0
4 0 983 102 0 26 0 0 180 8054 464 1306 21 56 24 0
2 0 1014 121 0 25 0 0 32 15780 656 1444 24 76 0 0
2 0 1043 116 0 25 0 0 174 15374 726 1508 23 75 2 0
4 0 1062 107 0 25 0 0 146 9460 585 1453 23 64 12 0
1 0 1096 128 0 25 0 0 154 17496 713 1453 21 79 0 0
5 0 1124 117 0 25 0 0 134 14686 592 1434 28 72 0 0
3 0 1136 109 0 24 0 0 116 6228 417 1397 24 50 26 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 1175 131 0 23 0 0 358 20094 755 1537 22 77 2 0
3 0 1199 116 0 22 0 0 146 12780 532 1476 26 61 14 1
3 0 1219 104 0 22 0 0 86 9946 584 1503 22 64 15 0
1 0 1247 127 0 22 0 0 256 14688 596 1469 17 69 13 1
2 0 1276 116 0 22 0 0 424 14754 569 1539 26 69 5 0
4 0 1291 102 0 22 0 0 578 8292 508 1341 29 64 7 0
1 0 1320 119 0 25 0 0 4558 14824 635 1529 21 72 7 0
3 0 1339 95 0 29 0 0 2128 10224 517 1326 25 66 8 1
5 0 1353 97 0 23 0 0 238 7394 499 1453 23 57 19 0
0 0 1383 122 0 21 0 0 412 15086 787 1546 21 76 3 1
3 0 1401 105 0 20 0 0 326 9420 583 1456 27 62 12 0
3 0 1427 103 0 19 0 0 398 13790 729 1521 24 71 5 0
1 0 1462 128 0 19 0 0 394 18198 677 1610 19 78 3 1
1 0 1488 114 0 19 0 0 238 13420 620 1495 21 71 8 0
5 0 1509 98 0 19 0 0 326 10842 663 1486 26 69 5 0
0 0 1545 130 0 19 0 0 328 18366 783 1474 16 82 2 0
3 0 1574 120 0 19 0 0 300 15042 684 1552 25 74 1 0
2 0 1597 103 0 18 0 0 290 11964 669 1496 23 73 3 0
6 0 1622 119 0 18 0 0 138 12884 1021 1387 20 80 0 0
5 0 1633 96 0 18 0 0 750 6304 1245 1252 22 79 0 0
4 0 1657 87 0 18 0 0 216 12268 922 1316 25 76 0 0
1 0 1684 108 0 18 0 0 366 14780 1083 1279 17 84 0 0
6 0 1706 90 0 19 0 0 576 11488 918 1446 27 74 0 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
4 0 1734 108 0 18 0 0 242 14646 840 1528 23 75 2 0
4 0 1767 111 0 18 0 0 302 17184 692 1501 22 78 0 0
7 0 1783 88 0 18 0 0 410 8566 583 1381 24 58 18 0
0 0 1812 116 0 18 0 0 368 14806 785 1545 19 76 4 0
2 0 1838 102 0 18 0 0 206 13634 782 1385 21 79 0 0
2 0 1852 108 2 23 0 0 3874 7338 730 1518 24 66 10 1
5 0 1853 103 4 22 0 0 3980 698 755 1647 38 62 0 1
3 1 1864 1110 4 23 0 0 2374 6100 706 1452 24 77 0 0
3 1 542 1783 5 27 0 0 14228 0 928 1763 14 76 0 10
2 1 536 1741 5 34 0 0 21896 50 1077 1908 13 73 0 13
0 0 533 1725 5 36 0 0 6890 0 539 1334 16 39 43 3
0 0 533 1724 5 36 0 0 8 0 135 350 2 5 93 0
由於這次試驗是接著上次做的,系統已經幾乎沒有Cache了,所以,直接消耗free,當把free消耗到100MB左右,然後啟動swap,當swap達到1.8GB時,程式報錯同上。和上面一樣,到報錯為止,總共消耗了3GB記憶體
總結:
1. 如果沒做特殊的限制,Linux對記憶體的消耗是:先消耗Cache或Free,再消耗Swap,然後報錯退出,退出後把記憶體還回給Free,然後swap迴歸到某個值(這個值不是很大)。
三、在CGroup上的測試
CGroup的一些資訊請參考:http://blog.csdn.net/zhxue123/article/details/8945236
1、把記憶體設定為300MB的結果如下:
[email protected]:/home/test/memleak# echo 300M >> /sys/fs/cgroup/memory/zhxue/memory.memsw.limit_in_bytes
[email protected]:/home/test/memleak# echo 300MB >> /sys/fs/cgroup/memory/zhxue/memory.limit_in_bytes
[email protected]:/home/test/memleak# cgexec -g memory:/zhxue ./memleak
[email protected]:/home/test# vmstat 3 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 3 3430 32 361 0 1 2 5 7 9 0 0 99 0
0 0 3 3431 32 361 0 0 0 0 43 37 0 0 100 0
0 0 3 3431 32 361 0 0 0 8 30 35 0 0 100 0
0 0 3 3391 32 361 0 0 0 0 56 47 0 0 99 0
0 0 3 3351 32 361 0 0 0 0 34 30 0 0 99 0
0 0 3 3311 32 361 0 0 0 0 34 30 0 0 99 0
0 0 3 3271 32 361 0 0 0 0 38 38 1 0 99 0
0 0 37 3233 32 361 0 12911 0 12913 101 57 0 1 97 2
0 0 88 3230 32 361 0 17327 0 17327 90 56 1 1 94 5
0 0 92 3234 32 361 0 1332 0 1332 95 47 0 0 99 0
0 1 144 3228 32 361 0 17811 0 17811 52 36 0 0 99 0
0 0 56 3377 32 361 0 6124 0 6124 111 40 0 1 91 9
0 0 56 3377 32 361 0 0 0 0 24 27 0 0 100 0
0 0 56 3377 32 361 0 0 0 7 32 40 0 0 100 0
0 0 56 3377 32 361 0 0 0 0 48 48 0 0 100 0
0 0 56 3377 32 361 0 0 0 0 36 41 0 0 100 0
0 0 56 3377 32 361 0 0 0 0 36 42 0 0 100 0
結論:當free消耗掉200M (2/3)記憶體時,swpd開始消耗,消耗了100M(1/3),程式被殺掉。
2、接著設定為2G結果如下:
[email protected]:/home/test# vmstat 3 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 56 3377 32 361 0 2 2 6 7 9 0 0 99 0
0 0 56 3377 32 361 0 0 0 0 108 64 0 0 98 0
0 0 56 3337 32 361 0 0 0 0 65 51 0 0 99 0
0 0 56 3297 32 361 0 0 0 8 36 40 0 0 99 0
0 0 56 3257 32 361 0 0 0 0 32 28 0 0 99 0
0 0 56 3217 32 361 0 0 0 0 31 30 0 0 99 0
0 0 56 3177 32 361 0 0 0 0 35 31 0 0 99 0
0 0 56 3137 32 361 0 0 0 5 36 34 0 0 99 0
0 0 56 3097 32 361 0 0 0 0 36 31 0 1 99 0
1 0 56 3090 32 361 0 0 0 0 27 26 0 0 100 0
0 0 56 3057 32 361 0 0 0 0 42 34 0 1 99 0
0 0 56 3016 32 361 0 0 0 0 44 29 0 1 99 0
0 0 56 2976 32 361 0 0 0 0 37 30 1 1 99 0
0 0 56 2936 32 361 0 0 0 0 37 33 0 1 99 0
0 0 56 2896 32 361 0 0 0 0 36 31 0 1 99 0
0 0 56 2856 32 361 0 0 0 0 99 81 0 1 98 0
0 0 56 2816 32 361 0 0 0 0 40 31 1 0 99 0
0 0 56 2776 32 361 0 0 0 8 43 36 0 1 99 0
0 0 56 2736 32 361 0 0 0 0 37 30 0 1 99 0
0 0 56 2696 32 361 0 0 0 0 37 33 1 1 99 0
0 0 56 2656 32 361 0 0 0 0 45 46 0 1 99 0
0 0 56 2616 32 361 0 0 0 0 40 34 0 1 99 0
0 0 56 2576 32 361 0 0 0 0 49 46 0 1 99 0
1 0 56 2566 32 361 0 0 0 0 44 52 0 0 100 0
0 0 56 2535 32 361 0 0 0 0 45 47 0 1 99 0
0 0 56 2495 32 361 0 0 0 0 41 29 0 1 99 0
0 0 56 2455 32 361 0 0 0 0 37 31 0 1 99 0
0 0 56 2415 32 361 0 0 0 0 44 39 0 0 99 0
0 0 56 2375 32 361 0 0 0 3 48 45 0 1 99 0
0 0 56 2335 32 361 0 0 0 0 42 42 1 1 99 0
0 0 56 2295 32 361 0 0 0 0 50 48 0 1 99 0
0 0 56 2254 32 361 0 0 0 0 107 89 1 1 97 0
0 0 56 2214 32 361 0 0 0 0 50 39 0 0 99 0
0 0 56 2174 32 361 0 0 0 8 61 60 1 1 99 0
0 0 56 2134 32 361 0 0 0 0 92 59 0 1 99 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 56 2094 32 361 0 0 0 0 53 53 0 1 99 0
0 0 56 2054 32 361 0 0 0 0 49 44 0 1 99 0
0 0 56 2014 32 361 0 0 0 0 49 46 0 1 99 0
0 0 56 1974 32 361 0 0 0 0 39 35 0 0 99 0
0 0 56 1934 32 361 0 0 0 0 39 38 0 0 99 0
0 0 56 1894 32 361 0 0 0 0 40 31 0 1 99 0
0 0 56 1854 32 361 0 0 0 1 37 30 0 1 99 0
0 0 56 1814 32 361 0 0 0 0 42 34 0 1 99 0
0 0 56 1774 32 361 0 0 0 8 40 39 0 1 99 0
0 0 56 1734 32 361 0 0 0 0 35 31 0 1 99 0
0 0 56 1693 32 361 0 0 0 7 38 29 0 1 99 0
0 0 56 1653 32 361 0 0 0 0 38 29 0 1 99 0
1 0 56 1643 32 361 0 0 0 0 31 31 0 0 100 0
0 0 56 1613 32 361 0 0 0 0 33 29 0 0 99 0
0 0 56 1573 32 361 0 0 0 0 39 25 0 1 99 0
0 0 56 1532 32 361 0 0 0 0 88 75 0 1 98 0
0 0 56 1493 32 361 0 0 0 0 40 33 0 1 99 0
0 0 56 1453 32 361 0 0 0 8 38 31 0 1 99 0
0 0 56 1413 32 361 0 0 0 0 36 34 0 1 99 0
0 0 56 3376 32 361 0 0 0 0 81 33 0 2 97 0
0 0 56 3376 32 361 0 0 0 0 31 37 0 0 100 0
結論:當free消耗掉2G記憶體時,程式被殺掉,Swap沒動作,和上一個結論有點出入(不過這個應該是合理的,上一個有點奇怪)。
3、接著設定為4G結果如下(host總共4G記憶體,所以一定能夠耗光):
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 56 138 33 361 0 0 0 0 75 47 0 1 99 0
0 0 56 130 33 361 0 0 0 0 39 40 0 0 99 0
0 1 55 106 28 351 0 0 0 0 541 74 0 1 80 18
0 1 52 95 23 333 0 0 0 3 3231 100 1 2 73 23
0 1 51 92 21 298 0 0 80 0 2418 133 1 2 71 23
0 1 51 91 10 271 0 0 0 0 1314 92 0 1 74 24
0 1 51 90 4 239 0 0 0 8 2021 88 0 2 73 24
0 1 51 89 4 200 0 0 0 0 2639 72 0 2 73 23
0 1 51 88 2 163 0 0 0 0 251 93 0 0 74 25
0 1 51 83 2 128 0 0 475 0 284 94 0 1 73 24
0 0 24 129 2 70 0 0 0 0 330 84 0 2 77 19
0 1 37 113 2 67 0 9056 0 9056 673 66 1 1 95 2
0 1 62 101 1 64 0 8323 61 8323 801 104 0 1 94 5
0 1 104 101 0 59 0 14497 0 14497 874 111 1 1 94 5
0 1 138 122 0 54 0 11433 0 11433 713 123 0 1 91 7
0 1 163 97 0 51 0 8765 0 8765 458 93 0 1 97 2
1 0 198 107 0 47 0 11928 0 11928 73 118 0 0 91 8
0 0 219 132 0 42 0 7217 0 7217 466 146 0 1 94 5
0 0 271 141 0 38 0 18060 25 18063 555 129 0 1 89 9
0 0 271 101 0 38 0 0 0 0 35 31 0 0 99 0
0 0 351 146 0 33 0 27369 0 27369 2499 206 1 2 73 22
0 0 351 106 0 33 0 0 0 0 51 33 0 0 99 0
0 0 10 3792 0 33 0 0 81 0 57 40 0 3 97 0
可以看到,free被耗到100M左右,開始消耗Cache,當Cahce耗到50MB左右,開始消耗swpd,最終正好消耗掉4G記憶體,程式終止。CGroup對記憶體的控制還是很精準的。
4、把CGroup大小設定為5G,繼續看結果:
[email protected]:/home/test# vmstat 3 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 42 3244 20 229 0 0 0 1 4 6 0 0 76 23
0 0 42 3203 20 229 0 0 0 0 51 32 0 1 98 0
0 0 42 3163 20 229 0 0 0 0 46 33 0 1 98 0
0 0 42 3123 20 229 0 0 0 0 50 29 0 1 98 0
0 0 42 3083 20 229 0 0 0 0 42 31 0 1 98 0
0 0 42 3043 20 229 0 0 0 4 43 31 0 1 98 0
0 0 42 3003 20 229 0 0 0 0 43 35 0 1 98 0
0 0 42 2963 20 229 0 0 0 11 43 33 0 1 98 0
0 0 42 2923 20 229 0 0 0 17 44 33 0 1 98 0
0 0 42 2883 20 229 0 0 0 0 43 34 0 1 98 0
0 0 42 2843 20 229 0 0 0 0 40 29 1 1 98 0
0 0 42 2803 20 229 0 0 0 0 41 28 0 1 98 0
0 0 42 2762 20 229 0 0 0 0 53 33 0 1 96 0
0 0 42 2722 20 229 0 0 0 0 48 34 0 1 98 0
1 0 42 2712 20 229 0 0 0 0 110 66 0 1 98 0
0 0 42 2682 20 229 0 0 0 0 40 27 0 1 97 0
0 0 42 2642 20 229 0 0 0 11 46 41 0 1 98 0
0 0 42 2602 20 229 0 0 0 0 53 30 0 1 97 0
0 0 42 2562 20 229 0 0 0 0 46 36 0 1 98 0
0 0 42 2521 20 229 0 0 0 0 48 28 1 1 98 0
0 0 42 2481 20 229 0 0 0 0 41 30 0 1 98 0
0 0 42 2441 20 229 0 0 0 0 45 31 0 1 98 0
0 0 42 2401 20 229 0 0 0 0 45 31 0 1 97 0
0 0 42 2361 20 229 0 0 0 0 49 32 0 1 97 0
0 0 42 2321 20 229 0 0 0 0 43 31 0 1 98 0
0 0 42 2281 20 229 0 0 0 0 45 31 0 1 98 0
0 0 42 2241 20 229 0 0 0 1 43 36 0 1 98 0
0 0 42 2201 20 229 0 0 0 0 44 30 0 1 98 0
1 0 42 2199 20 229 0 0 0 9 34 39 0 0 99 0
0 0 42 2161 20 229 0 0 0 0 47 34 0 1 98 0
0 0 42 2121 20 229 0 0 0 0 42 30 0 1 98 0
0 0 42 2079 20 229 0 0 0 0 125 69 1 2 93 0
0 0 42 2040 20 229 0 0 0 0 57 31 0 2 96 0
0 0 42 2000 20 229 0 0 0 8 54 38 0 1 97 0
0 0 42 1960 20 229 0 0 0 0 52 32 0 1 97 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 42 1919 20 229 0 0 0 0 68 27 0 1 95 0
0 0 42 1880 20 229 0 0 0 0 53 35 0 1 96 0
1 0 42 1845 20 229 0 0 0 0 46 27 0 1 96 0
1 0 42 1840 20 229 0 0 0 5 33 29 0 0 99 0
0 0 42 1800 20 229 0 0 0 0 51 32 0 1 97 0
0 0 42 1759 20 229 0 0 0 0 44 30 0 1 98 0
0 0 42 1719 20 229 0 0 0 0 48 31 0 1 98 0
0 0 42 1679 20 229 0 0 0 0 48 28 0 1 98 0
0 0 42 1639 20 229 0 0 0 1 45 30 0 1 98 0
0 0 42 1599 20 229 0 0 0 0 44 34 0 1 98 0
0 0 42 1559 20 229 0 0 0 8 46 32 0 1 97 0
0 0 42 1518 20 229 0 0 0 0 133 67 1 2 91 0
0 0 42 1478 20 229 0 0 0 0 43 33 0 1 98 0
0 0 42 1439 20 229 0 0 0 8 45 38 1 1 98 0
0 0 42 1398 20 229 0 0 0 0 42 34 0 1 98 0
1 0 42 1366 20 229 0 0 0 0 38 31 0 1 98 0
0 0 42 1358 20 229 0 0 0 0 30 29 0 0 99 0
0 0 42 1318 20 229 0 0 0 0 42 31 0 1 98 0
0 0 42 1278 20 229 0 0 0 0 45 35 1 1 98 0
0 0 42 1238 20 229 0 0 0 0 42 30 0 1 98 0
0 0 42 1198 20 229 0 0 0 7 41 32 0 1 98 0
0 0 42 1158 20 229 0 0 0 0 50 33 0 1 98 0
0 0 42 1118 20 229 0 0 0 0 44 31 0 1 98 0
0 0 42 1078 20 229 0 0 0 0 42 31 0 1 98 0
0 0 42 1038 20 229 0 0 0 0 41 36 0 1 98 0
0 0 42 998 20 229 0 0 0 0 48 39 0 1 98 0
0 0 42 957 20 229 0 0 0 0 142 70 1 2 93 0
0 0 42 917 20 229 0 0 0 0 47 32 0 1 98 0
0 0 42 877 20 229 0 0 0 8 52 35 0 1 97 0
0 0 42 837 20 229 0 0 0 0 42 33 1 1 98 0
1 0 42 821 20 229 0 0 0 0 35 29 0 1 99 0
0 0 42 797 20 229 0 0 0 0 41 33 0 1 98 0
0 0 42 757 20 229 0 0 0 0 47 32 0 1 98 0
0 0 42 717 20 229 0 0 0 0 41 34 0 1 98 0
0 0 42 677 20 229 0 0 0 0 47 40 0 1 98 0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 42 637 20 229 0 0 0 0 42 37 0 1 99 0
0 0 42 597 20 229 0 0 0 0 56 26 0 1 95 0
0 0 42 557 20 229 0 0 0 0 44 32 0 1 98 0
0 0 42 517 20 229 0 0 0 0 46 34 1 1 98 0
0 0 42 476 20 229 0 0 0 3 46 31 0 1 98 0
0 0 42 436 20 229 0 0 0 0 45 28 0 1 98 0
0 0 42 396 20 229 0 0 0 0 126 68 0 2 94 0
0 0 42 357 20 229 0 0 0 0 44 34 1 1 99 0
0 0 42 317 20 229 0 0 0 8 44 34 0 1 98 0
1 0 42 296 20 229 0 0 0 0 42 33 0 1 98 0
0 0 42 276 20 229 0 0 0 0 40 29 0 1 99 0
0 0 42 236 20 229 0 0 0 0 44 31 0 1 98 0
0 0 42 196 20 229 0 0 0 0 43 33 0 1 98 0
0 0 42 156 20 229 0 0 0 0 43 31 0 1 98 0
0 0 42 116 20 229 0 0 0 0 51 33 1 1 97 0
0 1 69 106 19 222 0 9365 0 9365 1106 250 0 4 81 12
0 0 129 115 10 219 64 20347 97 20347 1700 171 0 2 84 13
2 0 128 86 10 220 129 0 360 0 332 79 0 2 41 4
0 0 147 115 6 216 0 6235 0 6239 734 181 0 7 64 2
1 0 187 102 6 207 0 13664 0 13677 1200 79 1 5 85 3
4 0 209 82 6 204 4 7519 44 7520 179 74 1 2 80 1
0 0 209 111 6 200 21 0 408 0 409 119 0 1 93 1
0 0 279 119 6 187 0 23976 0 23995 2029 97 1 2 89 8
0 0 279 114 6 182 0 0 0 0 1104 36 1 1 98 0
0 0 333 118 6 172 0 18567 0 18567 1106 76 0 5 86 4
0 0 333 114 6 167 0 0 0 0 1280 32 0 1 98 0
0 0 390 119 6 156 0 19391 0 19391 1329 62 1 2 89 8
0 0 390 119 6 150 0 0 0 0 1099 35 0 1 97 0
0 1 442 100 6 140 0 17804 0 17819 170 50 0 4 79 11
0 0 487 114 6 131 0 15239 0 15239 1593 52 1 2 92 5
2 0 487 82 6 130 0 0 0 0 139 31 0 3 92 0
0 0 487 122 6 125 5 193 160 193 568 55 0 1 98 0
0 0 549 118 6 117 0 21037 0 21037 1075 105 0 2 87 10
0 0 562 119 6 111 0 4281 0 4281 1054 61 0 2 94 1
0 0 619 119 6 104 0 19539 17 19539 833 109 0 2 88 7
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 639 124 5 98 0 6919 0 6919 847 73 0 1 95 2
0 0 684 121 5 91 0 15312 0 15312 1146 106 0 2 93 5
2 0 699 127 5 86 0 5029 3 5029 342 105 1 5 76 2
0 1 746 111 5 82 0 16197 5 16197 908 95 0 3 90 4
0 0 763 120 4 76 0 5665 0 5673 936 113 0 1 93 5
0 1 791 94 2 75 0 9743 0 9743 1151 66 1 1 95 3
0 1 839 123 2 68 0 16271 0 16271 119 149 0 1 85 12
2 0 848 94 2 66 0 2987 0 2987 265 74 1 1 95 2
0 0 896 136 2 60 0 16496 0 16496 102 113 0 1 91 7
0 0 939 148 1 55 0 14727 0 14727 100 163 0 1 90 8
0 0 939 108 1 55 0 0 0 0 28 27 0 0 99 0
0 0 1003 151 1 51 0 21889 0 21889 1914 102 0 3 84 13
0 0 1003 111 1 51 0 0 0 0 35 32 0 0 99 0
0 1 1008 85 1 51 0 2080 0 2083 1436 52 0 2 76 20
1 1 1023 83 1 49 0 5715 0 5715 310 198 0 1 74 23
0 0 1023 100 1 7 0 0 0 7 600 44 0 5 85 1
可以看到程式先從主從中消耗掉4G,然後再開始消耗Swap,消耗SWap共1G,正好5G。CGroup和主機記憶體消耗的效果基本一致。
同時也可以看出,記憶體洩露會導致程式退出,或者影響其它程序(系統可用記憶體減少,導致其它程式申請記憶體失敗),但它不會把OS crash掉。