Cách phân bổ động bộ nhớ cho bộ chứa nhiều docker Môi trường Beanstalk AWS đàn hồi chạy các ứng dụng Java


8

Tôi muốn vắt kiệt từng ounce sử dụng có thể từ tầng đậu đàn hồi miễn phí.

Phần cuối của tôi được xây dựng dưới dạng một bộ microservice (sử dụng ktor). Tôi có 5 dịch vụ chính xác. Tất cả những cái này đều được neo và tôi đang cố gắng chạy tất cả chúng trên cùng một ví dụ beanstalk t2.micro (miễn phí) nhỏ với môi trường hình ảnh nhiều docker

Java là java, nó thích nhàn rỗi khoảng 200 MB RAM cho mỗi bộ chứa docker cho ngay cả dịch vụ siêu nhỏ đơn giản nhất.

Vì vậy, t2.micro cung cấp cho bạn RAM 1GB. Tôi có 5 container docker microservice yêu cầu ít nhất 200 MB mỗi cái = thực sự gần.

Vấn đề là, bộ nhớ hầu như luôn lơ lửng gần 100% gần như mọi lúc.

Vì vậy, có cách nào để tự động phân bổ bộ nhớ cho các container docker tùy thuộc vào mức độ miễn phí và mức độ tuyệt vời mà một container cần nó?

Giả sử rằng một container đang thực hiện một số thao tác nặng trong khi các container khác hầu như không hoạt động, tôi muốn hướng một số RAM về phía container đang thực hiện nhiệm vụ nặng và một khi nhiệm vụ kết thúc, hãy quay lại phân bổ RAM bằng nhau cho mỗi container.

Có cách nào để làm việc này không?

Câu trả lời:


1

Bạn có thể sử dụng docker update --memory-reservation xxx <container>để thay đổi cấp phát bộ nhớ giới hạn mềm cho một container trong khi nó đang chạy. Docker sẽ nhẹ nhàng đẩy container xuống giới hạn mềm của chúng khi bộ nhớ tổng thể thấp. Vì vậy, bạn có thể đặt giới hạn mềm là 150 MB cho tất cả các thùng chứa của mình và sau đó nâng một trong số chúng lên khi bạn biết rằng có nhiều việc phải làm.

Tài liệu docker về các giới hạn mềm không phải là tuyệt vời, tài liệu kernel cho Cgroup Memory giải thích nó tốt hơn.


Cảm ơn, tôi sẽ xem xét thêm về điều này. Mặc dù lý tưởng là tôi sẽ muốn một giải pháp, ví dụ: theo dõi động việc sử dụng bộ nhớ của nhiều bộ chứa và cung cấp thêm bộ nhớ cho bộ nhớ đang chạy rất gần mức cao nhất bất cứ lúc nào (để tối đa hóa hiệu suất). Vì vậy, trên máy chủ, việc thực hiện thủ công thay đổi giới hạn theo cách thủ công vì chúng có thể phụ thuộc vào thời gian công việc, lưu lượng truy cập, v.v.
Aditya Anand

Làm thế nào khác với việc không có quản lý bộ nhớ? Nếu một cá thể JVM trong một vùng chứa đang yêu cầu cấp phát bộ nhớ và một cá thể JVM khác trong vùng chứa khác đang giữ không gian heap không sử dụng, thì JVM thứ hai sẽ từ bỏ nó và để cái đầu tiên có nó ... Phải không?
CantankerousBullMoose

Là vậy sao? Bạn có thể liên kết đến một nguồn có thẩm quyền về chủ đề này? Theo kinh nghiệm của tôi, nó có vẻ là một chút ngẫu nhiên. Đôi khi, một cá thể chọn giữ một đống không sử dụng ngay cả khi nó bỏ qua trường hợp khác, trong trường hợp đó, các thể hiện khác bắt đầu sử dụng lượng bộ nhớ phân trang lớn hơn, làm mọi thứ chậm lại.
Aditya Anand

1
Điều này đang bắt đầu giống như một vấn đề Java hơn là một vấn đề về docker. Tôi đã không dành nhiều thời gian để chơi với họ, nhưng -XX: MaxHeapFreeRatio và -XX: MinHeapFreeRatio có nhiệm vụ kiểm soát mức độ mạnh mẽ của JVM và cung cấp bộ nhớ từ HĐH. Có lẽ điều đó sẽ cho bạn kết quả phù hợp hơn? Tài liệu Oracle trên Bộ sưu tập rác có một số chi tiết về những lá cờ đó.
CantankerousBullMoose

Vâng, một lần nữa, điều đó thực sự chỉ kiểm soát cấu hình tĩnh bắt đầu mà tôi có thể cung cấp một quy trình java, chứ không phải cách tôi có thể tự động quản lý bộ nhớ được phân bổ cho các quy trình khác nhau dựa trên nhu cầu.
Aditya Anand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.