2013-05-16 25 views
25

Chúng tôi chạy máy chủ XMPP trên node.js, trên máy có RAM khoảng 3,8 GB. Dưới đây là các tham số dòng lệnh mà chúng tôi truyền trong khi gọi nút: /opt/node/bin/node --max-old-space-size = 3000 --trace-gc --trace-gc-verbose main.jsĐịnh cấu hình quản lý bộ nhớ của v8 là thông minh cho quá trình node.js

Tuy nhiên, chúng tôi thường xuyên phải xem hơn 10 giây tạm dừng trong quá trình (đôi khi nhiều hơn 1 phút gc tạm dừng, nơi máy chủ của chúng tôi không làm gì ngoài việc chạy GC). Khi điều này xảy ra, quá trình của chúng tôi ở mức tiêu thụ bộ nhớ bình thường: khoảng 1 GB sử dụng đống. Có khoảng 2 GB hoặc không gian trống có sẵn cho quá trình này, nhưng quá trình này không sử dụng nó và dành một phút để giải phóng bộ nhớ.

Nhìn vào dấu vết gc được cung cấp bởi tùy chọn --trace-gc-verbose, có vẻ như khoảng 2 GB không gian trống được đánh dấu là "Không gian đối tượng lớn" và không được sử dụng vì không có nhiều đối tượng lớn . Và mặc dù quá trình này cần nhiều bộ nhớ hơn cho "Con trỏ cũ" và "Không gian dữ liệu cũ", bộ nhớ miễn phí này từ "Không gian đối tượng lớn" không được sử dụng.

Dưới đây là dấu vết để lại bởi gc trong một trong những thời điểm nơi có một tạm dừng gc dài trong quá trình này:

  

91635809 ms: Mark-sweep 968.8 (1039.0) -> 958.5 (1038.0) MB, 1/410 ms (+ 2287 ms in 79 steps since start of marking, biggest step 140.227051 ms) [idle notification: finalize incremental] [GC in old space requested]. 
Memory allocator, used: 1088446464, available: 2124390400 
New space,   used:  192, available: 8388416 
Old pointers,  used: 633992112, available: 10460240, waste:  0 
Old data space,  used: 315819248, available: 149776, waste:  0 
Code space,   used: 5867936, available: 1271392, waste:  0 
Map space,   used: 10257976, available: 6384072, waste:  0 
Cell space,   used: 175936, available: 954304, waste:  0 
Large object space, used: 51413600, available: 2123325184 
91636499 ms: Scavenge 965.5 (1038.0) -> 964.6 (1038.0) MB, 17 ms (+ 109 ms in 10 steps since last GC) [Runtime::PerformGC]. 
Memory allocator, used: 1088446464, available: 2124390400 
New space,   used: 41256, available: 2055896 
Old pointers,  used: 628458688, available: 15993664, waste:  0 
Old data space,  used: 315821792, available: 147232, waste:  0 
Code space,   used: 5904256, available: 1235072, waste:  0 
Map space,   used: 10263072, available: 6378976, waste:  0 
Cell space,   used: 175936, available: 954304, waste:  0 
Large object space, used: 51413600, available: 2123325184 
91637979 ms: Scavenge 966.6 (1038.0) -> 964.7 (1038.0) MB, 1 ms (+ 1404 ms in 43 steps since last GC) [Runtime::PerformGC]. 
Memory allocator, used: 1088446464, available: 2124390400 
New space,   used: 76736, available: 2020416 
Old pointers,  used: 628458688, available: 15993664, waste:  0 
Old data space,  used: 315845520, available: 123504, waste:  0 
Code space,   used: 5980576, available: 1158752, waste:  0 
Map space,   used: 10271416, available: 6370632, waste:  0 
Cell space,   used: 175936, available: 954304, waste:  0 
Large object space, used: 51413600, available: 2123325184 
91639088 ms: Mark-sweep 965.2 (1038.0) -> 935.8 (1038.0) MB, 1/369 ms (+ 2235 ms in 71 steps since start of marking, biggest step 69.053955 ms) [idle notification: finalize incremental] [GC in old space requested]. 
Memory allocator, used: 1088446464, available: 2124390400 
New space,   used:  168, available: 2096984 
Old pointers,  used: 641099768, available: 3352584, waste:  0 
Old data space,  used: 315820152, available: 148872, waste:  0 
Code space,   used: 5862976, available: 1276352, waste:  0 
Map space,   used: 10256744, available: 6385304, waste:  0 
Cell space,   used: 175936, available: 954304, waste:  0 
Large object space, used: 51413600, available: 2123325184 
91640987 ms: Scavenge 966.4 (1038.0) -> 964.5 (1038.0) MB, 1 ms (+ 1275 ms in 36 steps since last GC) [allocation failure]. 
Memory allocator, used: 1088446464, available: 2124390400 
New space,   used: 100944, available: 1996208 
Old pointers,  used: 627957504, available: 16494848, waste:  0 
Old data space,  used: 315830536, available: 138488, waste:  0 
Code space,   used: 5951200, available: 1188128, waste:  0 
Map space,   used: 10266376, available: 6375672, waste:  0 
Cell space,   used: 175936, available: 954304, waste:  0 
Large object space, used: 51413600, available: 2123325184 
91641560 ms: Scavenge 966.5 (1038.0) -> 964.8 (1038.0) MB, 2 ms (+ 481 ms in 29 steps since last GC) [Runtime::PerformGC]. 
Memory allocator, used: 1088446464, available: 2124390400 
New space,   used: 180712, available: 1916440 
Old pointers,  used: 627957504, available: 16494848, waste:  0 
Old data space,  used: 315871432, available: 97592, waste:  0 
Code space,   used: 6019392, available: 1119936, waste:  0 
Map space,   used: 10269848, available: 6372200, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2123325184 
91642589 ms: Mark-sweep 965.9 (1038.0) -> 947.7 (1038.0) MB, 1/371 ms (+ 2369 ms in 89 steps since start of marking, biggest step 67.302002 ms) [idle notification: finalize incremental] [GC in old space requested]. 
Memory allocator, used: 1088446464, available: 2124390400 
New space,   used:  264, available: 2096888 
Old pointers,  used: 639592840, available: 4859512, waste:  0 
Old data space,  used: 315849408, available: 119616, waste:  0 
Code space,   used: 5862976, available: 1276352, waste:  0 
Map space,   used: 10257136, available: 6384912, waste:  0 
Cell space,   used: 175936, available: 954304, waste:  0 
Large object space, used: 51413600, available: 2123325184 
91643688 ms: Scavenge 966.4 (1038.0) -> 964.6 (1038.0) MB, 5 ms (+ 356 ms in 21 steps since last GC) [Runtime::PerformGC]. 
Memory allocator, used: 1088446464, available: 2124390400 
New space,   used: 144088, available: 1953064 
Old pointers,  used: 627748368, available: 16703984, waste:  0 
Old data space,  used: 315864504, available: 104520, waste:  0 
Code space,   used: 5990240, available: 1149088, waste:  0 
Map space,   used: 10264248, available: 6377800, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2123325184 
91645276 ms: Scavenge 966.5 (1038.0) -> 964.8 (1039.0) MB, 2 ms (+ 1520 ms in 46 steps since last GC) [allocation failure]. 
Memory allocator, used: 1089495040, available: 2123341824 
New space,   used: 108192, available: 1988960 
Old pointers,  used: 627748368, available: 16703984, waste:  0 
Old data space,  used: 315978760, available: 1022200, waste:  0 
Code space,   used: 6039008, available: 1100320, waste:  0 
Map space,   used: 10274216, available: 6367832, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2122276608 
91645577 ms: Scavenge 966.6 (1039.0) -> 965.8 (1039.0) MB, 3 ms (+ 263 ms in 23 steps since last GC) [allocation failure]. 
Memory allocator, used: 1089495040, available: 2123341824 
New space,   used: 516168, available: 1580984 
Old pointers,  used: 627843088, available: 16609264, waste:  0 
Old data space,  used: 316550680, available: 450280, waste:  0 
Code space,   used: 6039008, available: 1100320, waste:  0 
Map space,   used: 10275280, available: 6366768, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2122276608 
91645645 ms: Scavenge 967.3 (1039.0) -> 966.8 (1039.0) MB, 5 ms (+ 8 ms in 16 steps since last GC) [allocation failure]. 
Memory allocator, used: 1089495040, available: 2123341824 
New space,   used: 1, available: 3182000    
Old pointers,  used: 627968088, available: 16484264, waste:  0 
Old data space,  used: 316947304, available: 53656, waste:  0 
Code space,   used: 6039008, available: 1100320, waste:  0 
Map space,   used: 10275280, available: 6366768, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2122276608 
91645948 ms: Scavenge 969.8 (1039.0) -> 968.6 (1041.0) MB, 9 ms (+ 188 ms in 35 steps since last GC) [allocation failure]. 
Memory allocator, used: 1091592192, available: 2121244672 
New space,   used: 1032320, available: 3161984 
Old pointers,  used: 628219008, available: 16233344, waste:  0 
Old data space,  used: 318537928, available: 526904, waste:  0 
Code space,   used: 6039264, available: 1100064, waste:  0 
Map space,   used: 10276232, available: 6365816, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2120179456 
91646093 ms: Scavenge 971.6 (1041.0) -> 970.5 (1042.0) MB, 13 ms (+ 36 ms in 30 steps since last GC) [Runtime::PerformGC]. 
Memory allocator, used: 1092640768, available: 2120196096 
New space,   used: 2044456, available: 6344152 
Old pointers,  used: 628437424, available: 16014928, waste:  0 
Old data space,  used: 319366376, available: 730392, waste:  0 
Code space,   used: 6039264, available: 1100064, waste:  0 
Map space,   used: 10276232, available: 6365816, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2119130880 
91646306 ms: Scavenge 976.5 (1042.0) -> 974.7 (1044.0) MB, 1/14 ms (+ 114 ms in 67 steps since last GC) [allocation failure]. 
Memory allocator, used: 1094737920, available: 2118098944 
New space,   used: 2064112, available: 6324496 
Old pointers,  used: 630440024, available: 14, waste:  0 
Old data space,  used: 321653384, available: 507256, waste:  0 
Code space,   used: 6055936, available: 1083392, waste:  0 
Map space,   used: 10278192, available: 6363856, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2117033728 
91646386 ms: Scavenge 980.6 (1044.0) -> 979.2 (1046.0) MB, 12 ms (+ 10 ms in 64 steps since last GC) [allocation failure]. 
Memory allocator, used: 1096835072, available: 2116001792 
New space,   used: 4127736, available: 12649480 
Old pointers,  used: 631182984, available: 13269368, waste:  0 
Old data space,  used: 323586008, available: 638504, waste:  0 
Code space,   used: 6055936, available: 1083392, waste:  0 
Map space,   used: 10278192, available: 6363856, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2114936576 
Limited new space size due to high promotion rate: 1 MB 
91646810 ms: Mark-sweep 979.2 (1046.0) -> 973.2 (1049.0) MB, 1/422 ms (+ 2500 ms in 303 steps since start of marking, biggest step 0.122070 ms) [StackGuard GC request] [GC in old space requested]. 
Memory allocator, used: 1099980800, available: 2112856064 
New space,   used:  192, available: 1048384 
Old pointers,  used: 636894816, available: 9621408, waste:  0 
Old data space,  used: 325256448, available:  0, waste:  0 
Code space,   used: 5860928, available: 1278400, waste:  0 
Map space,   used: 10257976, available: 6384072, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2111790848 
91646825 ms: Scavenge 974.2 (1049.0) -> 979.0 (1049.0) MB, 7 ms [allocation failure]. 
Memory allocator, used: 1099980800, available: 2112856064 
New space,   used: 257960, available: 790616 
Old pointers,  used: 635948464, available: 10567760, waste:  0 
Old data space,  used: 325256448, available:  0, waste:  0 
Code space,   used: 5873440, available: 1265888, waste:  0 
Map space,   used: 10258536, available: 6383512, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2111790848 
91646834 ms: Scavenge 979.7 (1049.0) -> 980.0 (1049.0) MB, 2 ms [allocation failure]. 
Memory allocator, used: 1099980800, available: 2112856064 
New space,   used: 257968, available: 790608 
Old pointers,  used: 635671408, available: 10844816, waste:  0 
Old data space,  used: 325256448, available:  0, waste:  0 
Code space,   used: 5873440, available: 1265888, waste:  0 
Map space,   used: 10258536, available: 6383512, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2111790848 
91646842 ms: Scavenge 980.7 (1049.0) -> 980.6 (1049.0) MB, 2 ms [allocation failure]. 
Memory allocator, used: 1099980800, available: 2112856064 
New space,   used: 257960, available: 790616 
Old pointers,  used: 635493872, available: 11022352, waste:  0 
Old data space,  used: 325256448, available:  0, waste:  0 
Code space,   used: 5873440, available: 1265888, waste:  0 
Map space,   used: 10258536, available: 6383512, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2111790848 
91646849 ms: Scavenge 981.3 (1049.0) -> 981.2 (1049.0) MB, 1 ms [allocation failure]. 
Memory allocator, used: 1099980800, available: 2112856064 
New space,   used: 257968, available: 790608 
Old pointers,  used: 635981640, available: 10534584, waste:  0 
Old data space,  used: 325256448, available:  0, waste:  0 
Code space,   used: 5873440, available: 1265888, waste:  0 
Map space,   used: 10258536, available: 6383512, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2111790848 
91646863 ms: Scavenge 981.9 (1049.0) -> 981.6 (1051.0) MB, 1 ms [allocation failure]. 
Memory allocator, used: 1102077952, available: 2110758912 
New space,   used: 257960, available: 790616 
Old pointers,  used: 637013288, available: 10534872, waste:  0 
Old data space,  used: 326288384, available:  0, waste:  0 
Code space,   used: 5873440, available: 1265888, waste:  0 
Map space,   used: 10258536, available: 6383512, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2109693696 
91651639 ms: Mark-sweep 981.6 (1051.0) -> 924.7 (1051.0) MB, 1/4775 ms [last resort gc]. 
Memory allocator, used: 1102077952, available: 2110758912 
New space,   used:  96, available: 1048480 
Old pointers,  used: 626794192, available: 20753968, waste:  0 
Old data space,  used: 275760200, available: 50528184, waste:  0 
Code space,   used: 6182208, available: 957120, waste:  0 
Map space,   used: 10257808, available: 6384240, waste:  0 
Cell space,   used: 176192, available: 954048, waste:  0 
Large object space, used: 51413600, available: 2109693696 
91663655 ms: Mark-sweep 924.7 (1051.0) -> 924.7 (1050.0) MB, 1/12015 ms [last resort gc]. 
Memory allocator, used: 1101029376, available: 2111807488 
New space,   used:  0, available: 1048576 
Old pointers,  used: 626169464, available: 21378696, waste:  0 
Old data space,  used: 275759960, available: 49496488, waste:  0 
Code space,   used: 5850624, available: 1288704, waste:  0 
Map space,   used: 10257808, available: 6384240, waste:     


Có bất kỳ điều chỉnh mà tôi có thể làm gì để cấu hình tốt hơn quản lý bộ nhớ v8 không? Bất kỳ ý tưởng về những gì có thể giúp đỡ ở đây?

+0

Nó không liên quan trực tiếp, nhưng bộ sưu tập thông báo nhàn rỗi là * thực sự * hung hăng về những gì nó coi 'nhàn rỗi', vì vậy bạn có thể thấy hiệu suất tổng thể tốt hơn với ít bộ sưu tập hơn: thêm "--nouse-idle-notification" vào thông số khởi động của bạn. – Joe

+0

Bản cập nhật: Chúng tôi đã thử sử dụng tùy chọn --nouse-idle-notification, tuy nhiên, nó không thực sự giúp ích cho việc tạm dừng. Và máy chủ dành cho giao tiếp XMPP thời gian thực, với trường hợp sử dụng hỗ trợ nhiều khách hàng/cuộc trò chuyện trực tiếp, chúng tôi không thực sự có thời gian rảnh/thời gian rảnh để gọi gc với sự trợ giúp của cờ –expose-gc và gc() gọi điện. –

Trả lời

20

Tôi nghĩ đó là giới hạn của V8. Nó không sử dụng hơn 1,7 GB RAM trên các máy 64 bit. Trích dẫn từ FAQ:

Hiện nay, bởi v8 mặc định có một giới hạn bộ nhớ của 512MB trên hệ thống 32-bit, và 1gb trên hệ thống 64-bit. Giới hạn có thể được tăng lên bằng cách đặt - tối đa-không gian-kích thước tối đa là tối đa ~ 1gb (32 bit) và ~ 1,7gb (64 bit), nhưng bạn nên chia quá trình đơn thành một số công nhân nếu bạn đang đạt đến giới hạn bộ nhớ.

Vì vậy, sau đây bạn sẽ đạt đến giới hạn bộ nhớ tối đa và tạm dừng 10 giây do thu gom rác thải là một lo lắng lớn. Bạn nên xem xét chạy bộ thu gom rác định kỳ/khi nhàn rỗi để tránh va chạm giới hạn và phải đối mặt với sự chậm trễ lâu dài.

thông số mà bạn có thể vượt qua để giúp tình hình là: (Kiểm tra này blog)

  • --nouse-idle-notification mà ngăn chặn chạy GC liên tục và
  • --expose-gc mà sẽ cho phép bạn chạy GC từ mã của bạn.

Quan trọng nhất là gỡ lỗi mã của bạn để loại bỏ rò rỉ bộ nhớ. Sử dụng các gói để tìm thấy chúng trong mã của bạn:

+0

@danneu Tôi khá chắc chắn chúng là dấu gạch ngang khi tôi trả lời. Ngay cả câu hỏi cũng sử dụng cùng một ký hiệu. – user568109

+1

Chắc chắn, chỉ cố gắng để người đọc trong tương lai biết kể từ khi tôi gặp sự cố này. :) – danneu

+12

Tôi có thể xác nhận dấu gạch ngang hoạt động bằng cách sử dụng phiên bản nút 0.10.33 cũng như 0.12.4. Một điều cần lưu ý là mặc dù tham số phải được truyền trước tập lệnh, do đó, thực hiện 'node --max-old-space-size = 8192 script.js' thay vì' node script.js --max-old- space-size = 8192' –