2011-12-19 13 views
5

Tôi đang viết một servlet Java mà tôi dự định triển khai trên Amazon AWS bằng cách sử dụng Elastic Beanstalk. Các bài kiểm tra của tôi cho thấy mọi thứ chạy tốt bằng cách sử dụng một cá thể EC2 nhỏ bằng cách sử dụng AMI của Tomcat mà Beanstalk sử dụng.Phân bổ một vùng heap Java cho Tomcat trên một cá thể EC2

Tôi đang cố gắng tìm ra cách phân bổ đúng không gian vùng Java cho cấu hình này. Một thể hiện nhỏ có bộ nhớ 1.7 GB, vì vậy tôi nghĩ rằng một heap 1024MB sẽ hoạt động tốt. Tôi nhận ra rằng bộ nhớ sẽ cần thiết cho những thứ khác mặc dù mục đích "thực sự" duy nhất của cá thể này là chạy Tomcat. Và tôi cũng biết rằng có một số điểm với đống lớn nơi Sun/Oracle JVM tiêu chuẩn không thực sự hoạt động.

Đây có phải là cách hợp lý để cấp phát bộ nhớ không? Tôi có nên sử dụng nhiều hơn hoặc ít hơn không? Tôi có thể sử dụng công cụ nào để giúp xác định cấu hình tối ưu?

Trả lời

2

1024 có vẻ ổn, có thể hơi nhiều.

Tôi không chắc chắn servlet của bạn đang làm gì, nhưng để cung cấp cho bạn ý tưởng, tôi có một ứng dụng thương mại điện tử với khoảng 1000 người dùng hàng ngày chạy trên 2 phiên bản ec2 nhỏ. Tải Tomcat được phân phối thông qua mod_jk.

Tôi không điều chỉnh JVM và giữ nguyên cài đặt mặc định. Tôi cũng đang sử dụng bộ nhớ đệm đối tượng phân tán đất nung, và quá trình đó dường như tiêu thụ phần lớn bộ nhớ.

Bạn có được triển khai trên hệ điều hành hoặc cửa sổ dựa trên Linux không? IMO, Linux thực hiện công việc tốt hơn trong việc quản lý bộ nhớ có sẵn.

Đối với các công cụ, tôi khuyên bạn nên triển khai ứng dụng của mình như một phiên bản ec2 nhỏ và sử dụng công cụ như JMeter để kiểm tra ứng dụng. Trong quá trình kiểm tra căng thẳng, bạn có thể mở tiện ích hàng đầu (giả sử ứng dụng của bạn nằm trên linux và đầu được cài đặt).

Cố gắng phá ứng dụng của bạn bằng cách xem số lượng tải nó có thể xử lý. Đó là vẻ đẹp của ec2, bạn có thể thiết lập một môi trường thử nghiệm trong vài phút và loại bỏ nó ngay sau đó.

+0

Cảm ơn bạn đã nhập. Tôi sẽ không đi sâu vào chi tiết về ứng dụng của chúng tôi. Nó cho phép người dùng xem thông tin về các chủ đề khác nhau, và sau đó có thể thêm thông tin cho họ. Một số thông tin về các chủ đề được tạo động từ cơ sở dữ liệu trong khi hầu hết là dữ liệu tĩnh mà chúng ta đọc từ các tệp lúc khởi động và được lưu giữ trong cấu trúc dữ liệu của riêng chúng ta trên heap. Tất cả cùng nhau, đó là khoảng 250-300 MB giá trị của dữ liệu. Tôi đoán rằng khi chúng tôi thực sự chạy, chúng tôi sẽ có vài chục nghìn người dùng mỗi ngày. –

+0

Trong dự án AWS trước đây của tôi, tôi đã cố gắng kiểm soát mọi thứ. Đối với dự án này, tôi quyết định tôi cần dành nhiều thời gian hơn cho ứng dụng "thực sự" và cách tiếp thị nó và không phải công việc CNTT đơn giản, vì vậy tôi chỉ đơn giản là sử dụng Stock Beanst. Điều đó có nghĩa là sử dụng AMI cổ phiếu của họ là Linux và Elastic Load Balancer. Có một số lý do tại sao bạn đang sử dụng mod_jk để phân phối tải thay vì ELB? Vì vậy, cho điều này, tại sao bạn nghĩ rằng 1024 là một chút quá nhiều? Điều đó để lại 700MB cho mọi thứ khác, mà thực sự không có gì khác ngoài các nhiệm vụ hệ điều hành tiêu chuẩn. Tôi đang xem xét điều này một cách chính xác? –

+0

@SanderSmith Tôi vẫn đang sử dụng ELB nhưng tôi đang sử dụng nó để cân bằng giữa 2 trường hợp máy chủ web apache nhỏ. Sau đó mod_jk được sử dụng từ các cá thể máy chủ web apache của tôi để phân phối tải cho các cá thể tomcat của tôi. Apache là tốt hơn trong việc phục vụ tài nguyên tĩnh và xử lý SSL tốt hơn, đó là lý do tại sao tôi đang sử dụng chúng. Tôi đoán điều tốt nhất bạn có thể làm là kiểm tra tải và đưa ra quyết định của bạn từ đó. Nếu ứng dụng của bạn đang mong nhận được 10 nghìn người dùng mỗi ngày, tôi không nghĩ rằng một cá thể ec2 nhỏ sẽ đủ cho dù bạn điều chỉnh JVM như thế nào –

0

Kiểm tra newrelic cho java để xác định bạn sử dụng mẫu heap.