문제

저는 Solaris에 Java와 C++가 혼합된 응용 프로그램을 가지고 있습니다.코드의 Java 측면은 웹 UI를 실행하고 우리가 대화 중인 장치의 상태를 설정하며, C++ 코드는 장치에서 돌아오는 데이터를 실시간으로 처리합니다.공유 메모리는 장치 상태 및 컨텍스트 정보를 Java 코드에서 C++ 코드로 전달하는 데 사용됩니다.Java 코드는 PostgreSQL 데이터베이스를 사용하여 상태를 유지합니다.

꽤 심각한 성능 병목 현상이 발생하고 있으며 현재 확장할 수 있는 유일한 방법은 메모리와 CPU 수를 늘리는 것입니다.공유 메모리 설계로 인해 우리는 하나의 물리적 상자에 갇혀 있습니다.


여기서 정말 큰 성공을 거둔 것은 C++ 코드입니다.웹 인터페이스는 장치를 구성하는 데 매우 가볍게 사용됩니다.우리가 정말로 어려움을 겪고 있는 부분은 일단 구성된 장치가 제공하는 데이터 볼륨을 처리하는 것입니다.

장치에서 반환되는 모든 데이터에는 장치 컨텍스트를 가리키는 식별자가 포함되어 있으므로 이를 조사해야 합니다.현재 Java/UI 코드에 의해 유지 관리되고 C++ 코드에 의해 참조되는 일련의 공유 메모리 개체가 있는데 이것이 병목 현상입니다.해당 아키텍처로 인해 C++ 데이터 처리를 다른 시스템으로 이동할 수 없습니다.장치의 다양한 하위 집합을 서로 다른 컴퓨터에서 처리할 수 있도록 확장할 수 있어야 하지만 그런 다음 컨텍스트 조회를 수행하는 기능을 잃게 됩니다. 이것이 바로 제가 해결하려고 하는 문제입니다.장치 컨텍스트를 계속 참조하면서 실시간 데이터 처리를 다른 상자로 오프로드하는 방법.

우리는 장치 자체에서 사용하는 프로토콜을 제어할 수 없으며 상황이 바뀔 가능성도 없습니다.


우리는 클러스터에 더 많은 시스템을 추가하여 확장할 수 있으려면 이 방식에서 벗어나야 한다는 것을 알고 있으며, 이를 수행할 방법을 정확히 파악하는 초기 단계에 있습니다.

지금은 Java 코드를 확장하는 방법으로 Terracotta를 보고 있지만 이에 맞춰 C++를 확장하는 방법을 아직 찾지 못했습니다.

성능 확장뿐 아니라 고가용성도 고려해야 합니다.애플리케이션은 거의 전체 시간 동안 사용할 수 있어야 합니다. 절대적으로 100%는 아니므로 비용 효율적이지는 않지만 시스템 중단 시 살아남기 위한 합리적인 작업을 수행해야 합니다.

만약 당신이 나에게 주어진 임무를 수행해야 한다면 어떻게 하시겠습니까?

편집하다:@john channing이 제공한 데이터를 기반으로 저는 GigaSpaces와 Gemstone을 모두 살펴보고 있습니다.Oracle Coherence 및 IBM ObjectGrid는 Java 전용인 것으로 보입니다.

도움이 되었습니까?

해결책

제가 가장 먼저 할 일은 데이터 흐름을 매핑하고 병목 현상이 발생하는 위치를 정확하게 이해하기 위해 시스템 모델을 구성하는 것입니다.시스템을 다음과 같이 모델링할 수 있는 경우 관로, 그런 다음 제약 이론(대부분의 문헌은 비즈니스 프로세스 최적화에 관한 것이지만 이는 소프트웨어에도 동일하게 적용됨)을 사용하여 지속적으로 성능을 개선하고 병목 현상을 제거할 수 있어야 합니다.

다음으로 시스템 성능을 정확하게 특성화하는 몇 가지 확실한 경험적 데이터를 수집하겠습니다.측정할 수 없는 것을 관리할 수 없다는 것은 진부한 표현이지만, 많은 사람들이 직감에 따라 소프트웨어 시스템을 최적화하려고 시도했지만 비참하게 실패하는 것을 보았습니다.

그런 다음 파레토 원리(80/20 규칙) 가장 큰 이익을 얻을 수 있는 소수의 것을 선택하고 그에만 집중하는 것입니다.

Java 애플리케이션을 수평으로 확장하기 위해 다음을 사용했습니다. 오라클 일관성 널리.어떤 사람들은 그것을 매우 비싸다고 무시하지만 분산 해시테이블, 기능은 그보다 훨씬 풍부하며 예를 들어 다음에서 캐시에 있는 데이터에 직접 액세스할 수 있습니다. C++ 코드 .

Java 코드를 수평으로 확장하기 위한 다른 대안은 다음과 같습니다. 기가 스페이스, IBM 객체 그리드 또는 보석 보석불.

C++ 코드가 상태 비저장이고 숫자 분석에만 사용되는 경우 다음을 사용하여 프로세스를 분산시키는 것을 볼 수 있습니다. 아이스 그리드 사용 중인 모든 언어에 대한 바인딩이 있습니다.

다른 팁

옆으로 확장해야 합니다.아마도 메시지 대기열 프런트엔드와 크런칭 사이의 백엔드가 될 수 있습니다.

Andrew 씨, (파이프라인 등으로 모델링하는 것 외에도) 사물을 측정하는 것이 중요합니다.코드에 대해 프로파일러를 실행하고 대부분의 시간이 소요되는 위치에 대한 측정 항목을 얻었습니까?

데이터베이스 코드의 경우 얼마나 자주 변경됩니까?지금 캐싱을 보고 계시나요?Db 속도를 높이기 위해 데이터에 대한 인덱스 등을 살펴봤다고 가정합니다.

프런트엔드의 트래픽 수준은 어느 정도입니까?웹페이지를 캐싱하고 있나요?(컴포넌트간 통신을 위해 JMS형 API를 사용한다고 말하는 것은 그리 어렵지 않습니다.그런 다음 웹 페이지 구성 요소를 하나 이상의 시스템에 배치한 다음 통합 코드(C++)를 다른 시스템에 배치할 수 있습니다. 많은 JMS 제품에는 일반적으로 기본 C++ API가 있습니다.ActiveMQ가 떠오릅니다. 그러나 웹(JSP ?), C++, 데이터베이스 작업에 얼마나 많은 시간이 소요되는지 아는 것이 정말 도움이 됩니다.

데이터베이스가 비즈니스 데이터를 저장하고 있습니까, 아니면 Java와 C++ 간에 데이터를 전달하는 데에도 사용됩니까?JNI가 아닌 공유 mem을 사용하고 있다고 말씀하셨나요?현재 앱에는 어떤 수준의 멀티스레딩이 존재합니까?코드를 본질적으로 동기식으로 설명하시겠습니까, 아니면 비동기식으로 설명하시겠습니까?

Solaris 코드와 유지 관리해야 하는 장치(예:모든 장치를 C++ 코드로 등록하거나 이를 지정할 수 있습니다.즉.웹로드밸런서를 프론트엔드에 놓고 오늘은 2대의 머신만 올려놓는다면, 앞쪽에 초기화된 박스에 의해 관리되는 디바이스는 어떤 관계인가요, 아니면 미리?

HA 요구 사항은 무엇입니까?즉.그냥 상태 정보인가요?세션 데이터를 클러스터링하여 웹 계층에서만 HA를 수행할 수 있습니까?

DB가 다른 컴퓨터에서 실행되고 있습니까?

DB는 얼마나 큽니까?쿼리를 최적화했습니까?명시적인 내부/외부 조인을 사용해 보면 중첩된 하위 쿼리(일부)에 비해 도움이 되는 경우가 있습니다.(다시 SQL 통계를 살펴보십시오).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top