Ứng dụng java hoạt động kém so với máy chủ hoạt động kém


7

Đây là một câu hỏi rất chung chung, nhưng nó đã xuất hiện ngày càng thường xuyên hơn đối với tôi. Tôi muốn thử và xác định một hướng hành động thích hợp cho trường hợp chung này, vì tôi nghĩ nó có thể mang lại lợi ích cho tôi và các hệ thống khác trong tương lai. Điểm chung trong mọi trường hợp là java. Lý do tôi hỏi câu hỏi này ở đây thay vì stack overflow là đây là một câu hỏi sysadmin. Tôi nghĩ rằng nó rất thích hợp ở đây.

Một người dùng đến gặp tôi và nói rằng "Ứng dụng của tôi rất chậm. Máy chủ mà bạn cung cấp cho tôi có hiệu suất kém." Máy chủ này có thể là kim loại trần, OpenVZ hoặc KVM. Trong mọi trường hợp, HĐH là CentOS 6. Khi người dùng cho tôi biết điều này, họ đang đề cập đến thời gian tải trang (JIRA) hoặc số điểm chuẩn. (Selenium hoặc ứng dụng độc quyền)

Bây giờ, tôi có một nghi ngờ lén lút rằng bản thân máy chủ vẫn ổn. Tôi sshvào máy chủ và nhận thấy rằng tải ít hơn 1. Việc sử dụng bộ nhớ cũng tốt, dao động từ 2-20 gigs ram miễn phí. Cuối cùng, tôi kiểm tra iowaitvới vmstat, và thông báo rằng nó là 0. CPU nhàn rỗi là 99.

Nhìn vào Java với top, tôi có thể thấy rằng tỷ lệ phần trăm CPU là khoảng 200% hoặc hơn cho quá trình đó. Đây là trên các hệ thống có từ 4 đến 24 lõi.

Tất nhiên, openvzphân bổ bộ xử lý khác với KVM hoặc kim loại trần.) Trong trường hợp điều này xảy ra với một khách openvzhoặc kvmkhách, tôi cũng nhảy lên máy chủ và thấy những điều tương tự. cpu nhàn rỗi là 99%. iowait là 0. bộ nhớ đôi khi là hàng trăm hợp đồng biểu diễn miễn phí.

Tôi đã xem xét các quá trình và chủ đề java với strace, và strace -f. Có hàng tấn Futex, đồng hồ, và epoll. Nếu tôi đảo ngược grep những cái đó, tôi sẽ để lại chủ yếu là ioctl, stat, sendto.

Các ứng dụng đã xảy ra: Selenium, JIRA và các ứng dụng java độc quyền. Luôn luôn java mặc dù.

Tôi đã xem xét điều chỉnh tính độc đáo của các quy trình java, nhưng tính độc đáo của AFAIK sẽ chỉ ảnh hưởng đến cách các quy trình được lên lịch. Nếu tải thấp, nó sẽ không giúp tăng tốc mọi thứ.

Đôi khi ứng dụng sử dụng mysql, nhưng nhìn vào mysql trên cùng cho thấy hầu như không sử dụng cpu ở đó. Tôi đoán rằng nếu đó là nút cổ chai, chúng ta sẽ thấy việc sử dụng cpu cao hơn.

Tóm lại: Làm thế nào để tôi chứng minh với người dùng rằng máy chủ hoạt động tốt, nhưng ứng dụng của họ tệ? Về mặt lý thuyết, ứng dụng có thể chậm vì gặp phải vòng lặp while sẽ không bao giờ thoát. Điều đó khiến tôi tin rằng nhiệm vụ này là không thể, tương tự như giải quyết vấn đề tạm dừng. o_O Nhưng có lẽ tôi có thể điều chỉnh java để hành xử tốt hơn một chút, hoặc có lẽ có một cách để cấu hình ứng dụng đang chạy, chỉ vào một đoạn mã và nói "Có vấn đề của bạn".


Câu trả lời:


7

Sherlock!

Một khi bạn loại bỏ những điều không thể, bất cứ điều gì còn lại, cho dù có khả thi đến đâu, đều phải là sự thật. --Arthur Conan Doyle

Trước tiên, bạn có thể muốn xem bài nói chuyện này , đây là một cuộc thảo luận về nguồn gốc của các vấn đề về hiệu suất và cách chẩn đoán chúng. Nó so sánh Linux với SmartOS, một loại tách biệt với quan điểm của bài đăng của bạn, nhưng nó cũng giúp làm sáng tỏ vấn đề hiệu suất đến từ đâu.

Thông thường khi bạn gỡ lỗi các vấn đề về hiệu năng với phần mềm, bạn nên thử và sao chép chính xác cấu hình phần mềm trên một máy vật lý riêng biệt, với cùng một phiên bản Java, cùng một hạt nhân, cùng một vùng người dùng, v.v. Nếu vấn đề về hiệu năng không tồn tại , sau đó bạn có thể bắt đầu xem xét phần cứng vật lý, lớp ảo hóa / lớp chứa hoặc các vấn đề cài đặt trên hộp của bạn.

Nếu người dùng chưa bao giờ chạy phần mềm này trong cấu hình phiên bản / hệ điều hành cụ thể này trước đó, thì họ không thể ngay lập tức cho rằng đó là máy chủ của bạn. Tôi thà đặt gánh nặng bằng chứng lên họ để chứng minh rằng, chạy CentOS 6 (với cùng một phiên bản nhỏ và cùng một trình ảo hóa và cùng một hệ điều hành máy chủ, nếu nó không chạy trên kim loại trần), họ có thể có hiệu suất tốt hơn.

Nếu hiệu năng tốt hơn là do chúng có nhiều thông số kỹ thuật hệ thống vượt trội (ví dụ: chúng chạy nó trên KVM 1 GB trên bộ xử lý cấp thấp trên cơ sở hạ tầng của bạn, nhưng trên hệ thống Ivy Bridge E5 24 lõi của riêng chúng với 8 ổ SSD PCIe phần cứng RAID0, nhanh hơn 1000%), sau đó bạn có thể bắt đầu nói về phần cứng vật lý. Nếu phần cứng vật lý giống hoặc rất giống nhau, bạn có thể bắt đầu nói về cấu hình OS / hypanneror.

Bạn cũng có thể xem xét khả năng, dựa trên hiệu suất của ứng dụng và số lượng người dùng và khối lượng công việc dữ liệu, phần cứng mà người dùng đã được phân bổ chỉ đơn giản là không đủ cho tác vụ. Nếu đây là một khách hàng rất quan trọng và giữ cho họ hạnh phúc là điều tối quan trọng đối với doanh nghiệp của bạn, bạn có thể thử sao lưu một số hạn chế mà bạn có thể áp dụng đối với thùng chứa ảo hoặc ví dụ VM của họ; ví dụ, tạm thời cung cấp cho họ thêm RAM hoặc thời gian CPU, băng thông mạng, v.v. và xem điều đó có giúp ích gì không. Nếu vậy, bạn có thể phải nói với người dùng rằng họ sẽ phải trả tiền cho một VM lớn hơn để có được hiệu suất họ muốn trên khối lượng công việc đó.


Thoát khỏi vết bỏng (khi đó không phải là vấn đề của bạn)

Nếu vì lý do nào đó, người dùng thẳng thừng từ chối thử cấu hình phần mềm tương tự trên phần cứng riêng biệt, bạn sẽ phải nhờ đến việc giúp họ khắc phục sự cố về hiệu suất trong ứng dụng của họ (điều khó có thể xảy ra trên Linux, như Brendan Gregg mô tả trong cuộc nói chuyện của anh ấy, đôi khi bạn có thể phải "mặc" chi phí hiệu năng đó), hoặc đơn giản nhấn mạnh rằng người dùng không chính xác. Đây là một tác dụng phụ đáng tiếc của việc hỗ trợ các nhà phát triển trên hệ thống của bạn.

Tại thời điểm này, bạn có thể cần phải tự hỏi mối quan hệ kinh doanh của bạn với người dùng của bạn (nếu có). Nếu bạn đang cung cấp dịch vụ lưu trữ không được quản lý trong khu vực tư nhân, bạn có thể phải khẳng định rằng bạn không chịu trách nhiệm đảm bảo hiệu suất của mã người dùng.

Nếu bạn đang cung cấp dịch vụ lưu trữ được quản lý hoặc có thỏa thuận khác để giúp những người phần mềm giải quyết vấn đề của họ bất kể vấn đề là lỗi của họ, bạn có thể phải xắn tay áo lên, làm bẩn tay và bắt đầu chạy một số cấu hình hiệu năng phức tạp hơn công cụ, để xem nếu bạn có thể phát hiện ra một vấn đề thực tế . Có phải nó chỉ là một giao thức chặn thực sự trò chuyện trên một ổ cắm mạng? Có phải bộ nhớ I / O-ràng buộc? Hoặc có thể BIOS không kích hoạt VT-x? Có quá nhiều khả năng để liệt kê.

Để tóm tắt phần này: nếu bạn có thể tìm thấy một số lý do kinh doanh hoặc chính trị để bào chữa cho mình khỏi trách nhiệm giải quyết vấn đề này, đó có thể là cách dễ dàng và hiệu quả nhất. Thật không may, điều này cũng có nghĩa là người dùng có thể không bao giờ khắc phục vấn đề của họ và có thể dùng đến việc xem xét các đối tác kinh doanh khác như một giải pháp thay thế.


Quạt lửa (khi đó là vấn đề của bạn)

Do chủ đề chung "xuất hiện" là Java, nên bạn có thể bắt đầu bằng cách ít nhất là xác định xem chính quá trình Java có đang chạy một số mã cực kỳ chậm hay không. Đối với điều này, lý tưởng nhất, nhà phát triển / người dùng / khách hàng sẽ có thể cung cấp cho bạn mã nguồn của chương trình Java của họ (và tất cả các thư viện phụ thuộc).

Hãy thử chạy chương trình dưới một hồ sơ tốt . Có hồ sơ miễn phí và không miễn phí; một ví dụ về một cái miễn phí là một ví dụ đi kèm với NetBeans . Bắt trình hồ sơ khởi chạy thành công và cung cấp cho ứng dụng của bạn có thể là một thách thức, tùy thuộc vào chính xác ứng dụng đó là gì, nhưng kết quả hầu như luôn luôn nói theo một cách nào đó.

Tất nhiên, bạn có thể sử dụng htopvà / hoặc iotopđể phát hiện xem máy ảo Java (hoặc RDBMS được liên kết) đang thực hiện một lượng CPU, I / O bộ nhớ hoặc I / O đĩa không vượt quá số lượng mà bạn xem xét " hợp lý "(đưa ra phần cứng và khối lượng công việc). Đây là những công cụ cực kỳ rộng và không phải lúc nào cũng cung cấp cho bạn bức tranh đầy đủ, bởi vì đôi khi các vấn đề về hiệu năng là về những gì chương trình không làm trong khi chờ đợi một thứ khác, có thể không liên quan đến nút cổ chai tài nguyên. Đây là một bước xử lý sự cố chung chung khi cố gắng khởi động xe của bạn để xác định xem động cơ có chạy đúng hay không. Nếu nó không bắt đầu, tốt, bạn sẽ làm gì? Cái đó'

Cuối cùng, tôi sẽ chỉ nhắc lại những gì Brendan Gregg đã nói trong bài nói chuyện của anh ấy, và đề cập đến DTrace. Chức năng đầy đủ của DTrace vẫn chưa được sao chép trên Linux, cũng không phải do sự tái hiện dtrace-on-linux, cũng như bất kỳ đối thủ nào, như SystemTap. Điều đó nói rằng, bạn có thể cố gắng sử dụng một trong những công cụ này và xem liệu nó có giúp ích gì không. Một số cái nhìn sâu sắc có thể tốt hơn không có .

Tất nhiên, bạn sẽ cần chuyên môn cụ thể với việc sử dụng các công cụ loại rất "dao-quân-dao" này. Bạn sẽ đạt được hầu hết chuyên môn đó thông qua rất nhiều kinh nghiệm (đọc: dùng thử và lỗi và googling). Đây không phải là vấn đề chỉ cần kích hoạt công cụ và để nó chỉ cho bạn vấn đề; bạn sẽ cần khắc phục sự cố dựa trên dữ liệu có sẵn. Nó không dễ. Hiệu suất hiếm khi là.

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.