LMAX 팀이 Java를 사용하고 GC를 피하기 위해 아키텍처를 설계 한 이유는 무엇입니까?


24

LMAX 팀 이 Java로 LMAX Disruptor 를 설계했지만 모든 설계 포인트가 GC 사용을 최소화하는 이유는 무엇 입니까? GC를 실행하지 않으려면 왜 가비지 수집 언어를 사용해야합니까?

그들의 최적화, 하드웨어 지식 수준 및 그들이 생각하는 생각은 훌륭하지만 왜 Java입니까?

Java 또는 다른 것에 반대하지 않지만 왜 GC 언어입니까? 왜 GC없이 D 나 다른 언어를 사용하지 말고 효율적인 코드를 사용할 수 있습니까? 팀이 Java에 대해 가장 친숙한 것입니까, 아니면 Java가 보지 못하는 독특한 이점을 가지고 있습니까?

수동 메모리 관리와 함께 D를 사용하여 개발한다고 가정하면 차이점은 무엇입니까? 그들은 이미 저수준을 생각해야하지만, 시스템의 기본 성능을 최대한 발휘할 수 있습니다.


6
이 프로젝트에 대해서는 거의 알지 못하지만 다른 사람들이 만들 수있는 일종의 프레임 워크 인 것 같습니다. Java로 작성하고 다른 사람들이 Java로 코드를 작성하고 혜택을 얻을 수 있다면 D로 작성했을 때보 다 훨씬 더 큰 "고객 기반"을 갖게됩니다.
Joachim Sauer

6
@kadaj : 소비자가 공개 또는 내부인지 여부는 중요하지 않습니다. 널리 알려진 언어로 액세스 할 수있게하면 내부 개발에도 더 유용 할 것입니다. "가상적인"주장을 "모든 사람이 D뿐만 아니라 Java를 알고 있다고 가정하면 ..."으로 시작하면 아마도 뭔가 빠진 것입니다.
Joachim Sauer

6
어떤 사람들은 모든 종류의 문제에 망치를 사용하는 것을 좋아합니다. 당신이 계획을 세우고 싶은 거친 가장자리를 얻었고, 망치로 부드럽게 때리십시오. 당신이 필요로하는 나사를 가지고, 망치로 그것의 안으로 때까지 그것을 강타하십시오. 당신이 사포질을 필요로하는 섬세한 장식이 있고, 망치로 그것을 강타한 다음, 장식물을 "빨리 다"라고 비난하십시오. 기존 지식 기반에 대해서만 C 또는 C ++가 D보다 더 나은 선택이었습니다. TBH를 예로 들어 왜 D를 키웠는 지 잘 모르겠습니다.
gbjbaanb

2
@gbjbaanb 나는 가비지 콜렉션을 제공하기 때문에 D를 언급했다. D는 ARC (실제 GC 없음)가있는 Objective-C와 비슷하지만 그보다 낫습니다. 그러나 C / C ++는 그 계산에 적합 할 것입니다.

4
@kadaj 나는 당신이 D를 기르기 위해 여기에 약간의 괴짜를 얻고있는 것을 보았지만 다른 사람들이 사용하는 어조에 실망하고 D가 문제의 중심에 있다고 생각하는 이유를 설명하고 싶습니다. D는 실제로 널리 사용되지는 않지만 D는 Java 또는 C #에서는 찾을 수 있지만 (적어도 구식) C ++에서는 찾을 수없는 고급 구성을 제공합니다. 그것은 여전히 ​​관리되는 것과 관리되지 않는 것을 혼합하는 것을 제공합니다-그것은 내가하는 유일한 언어에 불과합니다! 따라서 D는 단순한 애완 동물 선택이 아니라 GC와 관련된 원래의 질문과 일치하는 목표를 가진 것입니다.
J Trana

답변:


20

성능 최적화완전히 안전 해제 사이 에는 차이 가 있기 때문에

GC의 수를 줄임으로써 프레임 워크의 응답 성이 향상되고 (아마도) 더 빠르게 실행될 수 있습니다. 이제 가비지 수집기를 최적화한다고해서 가비지 수집을하지 않는 것은 아닙니다. 그것은 그들이 덜 자주하는 것을 의미하며, 그렇게 할 때 정말 빠릅니다. 이러한 종류의 최적화에는 다음이 포함됩니다.

  1. 작은 버리기 오브젝트를 사용하여 생존자 공간으로 이동하는 오브젝트 수를 최소화합니다 (즉, 하나 이상의 가비지 콜렉션에서 살아남은 것). 생존자 공간으로 이동 한 오브젝트는 수집하기 어렵고 여기서 가비지 콜렉션은 때때로 전체 JVM을 동결시키는 것을 의미합니다.
  2. 시작할 객체를 너무 많이 할당하지 마십시오. 젊은 세대 객체는 할당 및 수집이 매우 저렴하므로 조심하지 않으면 역효과를 낼 수 있습니다.
  3. 어린 물건을 쉽게 모을 수 있도록 새 물건이 오래된 물건을 가리키고 다른 물건이 아니라는 것을 확인하십시오.

성능을 조정할 때는 일반적으로 자주 실행되지 않는 코드를 무시하고 매우 구체적인 "핫스팟"을 조정합니다. Java로 그렇게하면 가비지 수집기가 여전히 어두운 모서리를 돌 보도록 할 수 있습니다 (많은 차이가 발생하지 않기 때문에) 꽉 루프에서 실행되는 영역에 대해 매우 신중하게 최적화합니다. 따라서 최적의 위치와 그렇지 않은 위치를 선택할 수 있으므로 원하는 곳에 노력을 집중할 수 있습니다.


이제 가비지 콜렉션을 완전히 끄면 선택할 수 없습니다 . 모든 개체를 수동으로 폐기해야합니다 . 그 방법은 하루에 한 번만 호출됩니까? Java에서는 성능에 미치는 영향이 무시할 수 있으므로 그대로 둘 수 있습니다 (매월 전체 GC가 발생하도록해도 괜찮습니다). C ++에서는 여전히 리소스가 유출되므로 해당 모호한 방법조차도주의해야합니다. 따라서 애플리케이션의 모든 단일 부분 에서 리소스 관리 비용을 지불해야 하며 Java에서는 집중할 수 있습니다.


그러나 악화됩니다.

버그가있는 경우 월요일 보름달에만 액세스 할 수있는 애플리케이션의 어두운 구석에 있다고 가정 해 봅시다. Java는 강력한 안전성을 보장합니다. "정의되지 않은 동작"은 거의 또는 전혀 없습니다. 잘못된 것을 사용하면 예외가 발생하고 프로그램이 중지되며 데이터가 손상되지 않습니다. 그래서 당신은 당신이 알지 못하고 아무 잘못도 일어날 수 없다고 확신합니다.

그러나 D와 같은 경우 포인터 액세스가 잘못되거나 버퍼 오버플로가 발생하여 메모리가 손상 될 수 있지만 프로그램은 알 수 없으며 (안전을 끄고 기억합니까?) 잘못된 상태로 계속 실행됩니다. 데이터, 그리고 아주 불쾌한 일을하고 데이터를 손상시킵니다. 그리고 당신은 알지 못하고, 더 많은 손상이 발생하면 데이터가 점점 더 잘못되고 갑자기 데이터가 깨져서 생명에 중요한 응용 프로그램에 있었고, 일부 오류는 로켓의 계산에서 일어난, 그렇지 않은 작업, 그리고 로켓 폭발, 누군가 다이를 수행하고 회사가 모든 신문의 첫 페이지에 있고 당신의 상사 점은 그것의 손가락 그래서 당신이 말하는 "당신은 있다 성능 최적화를 위해 D를 사용했다고 제안한 엔지니어 는 안전에 대해 어떻게 생각하지 않았습니까?". 그리고 그것은 당신의 잘못입니다. 당신 은 어리석은 행위로 그 사람들을 죽였습니다.


알았어, 대부분의 시간은 그것보다 훨씬 덜 드라마틱하다. 그러나 비즈니스 크리티컬 응용 프로그램이나 GPS 응용 프로그램 또는 정부 의료 웹 사이트 조차 버그가 있으면 매우 부정적인 결과를 초래할 수 있습니다. 문제가 발생했을 때이를 완전히 예방하거나 실패 할 수있는 언어를 사용하는 것이 좋습니다.

안전을 끄는 비용이 있습니다. 네이티브가되는 것이 항상 의미가있는 것은 아닙니다. 언젠가는 발로 크게 쏠 수있는 언어를 위해 조금이라도 안전한 언어를 최적화하는 것이 훨씬 간단하고 안전합니다. 많은 경우의 정확성과 안전성은 GC를 완전히 제거함으로써 몇 초 만에 폐기했을 것입니다. 이러한 상황에서 혼란을 일으킬 수 있으므로 LMAX-Exchange가 올바른 전화를 한 것으로 생각합니다.

그러나 특히 D는 어떻습니까? 어두운 구석을 원한다면 GC가 있고 SafeD 하위 집합 (편집 전에 알지 못했던)은 정의되지 않은 동작을 제거합니다 (사용하는 것을 기억한다면!).

그렇다면 그 성숙도에 대한 간단한 질문입니다. Java 생태계는 잘 작성된 도구와 성숙한 라이브러리로 가득합니다 (개발하기에 더 좋습니다). D보다 Java를 아는 개발자가 훨씬 많습니다 (유지 보수가 더 낫습니다). 재정적 응용 프로그램만큼 중요한 것을 위해 새롭고 인기없는 언어를 사용하는 것은 좋은 생각이 아닙니다. 잘 알려지지 않은 언어를 사용하면 문제가 발생하면 도움을 줄 수있는 사람이 거의 없으며, 찾은 라이브러리는 적은 사람들에게 노출 된 이후 더 많은 버그가있는 경향이 있습니다.

따라서 마지막 요점은 여전히 ​​유지합니다. 심각한 결과로 인한 문제를 피하려면 안전한 선택을하십시오. D의 삶에서이 시점에서 고객은 미친 위험을 감수 할 준비가 거의되지 않은 신생 기업입니다. 문제가 수백만 달러에 달할 수 있다면 혁신 종 곡선을 계속 유지하는 것이 좋습니다 .


2
원래 게시물은 구체적으로 D를 호출합니다. 실제로 선택의 세분성과 관련하여 C ++과 D 사이에는 큰 차이가 있습니다. SafeD 하위 집합에서 전체 관리를 선택하더라도 수집 및 타이밍의 특정 측면 (활성화 / 비활성화, 수집, 최소화)을 상당히 제어 할 수 있다고 생각합니다. 메모리 관리를위한 Digital Mars의 전략을
J Trana

2
lmax는 자바가 제공하는 일부 안전 기능을 일부러 회피했다
James

Java가 미션 크리티컬 소프트웨어 용으로 라이센스되지 않은 경우를 제외하고는 훌륭한 답변입니다. 원자로가 있다면 Java가 아닌 C ++로 작성되어 전체 "안전성"측면을 버린다.
gbjbaanb

@gbjbaanb, [인용 필요]. 내가 본 신뢰성 표준 / 지침은 먼저 다른 언어를 선호하는 C / C ++를 피하는 것이 좋습니다 . 그리고 언어에 들어가면 매우 제한적인 언어 (MISRA 등)를 사용합니다. 그리고 일단 당신이 제한을 받아들이면, 당신이 다른 언어로 똑같이 할 수없는 이유를 알 수 없습니다. RESTRICTIONS 섹션에서 Java Licence의 "핵 시설이 아님"에 대한 언급을 생각하고 있다면, 얼마 전에 변경된 것처럼 보였으며 이제는 "우리의 책임이 아니라 조심해야 할 것"과 비슷한 것을 말합니다. 아직도, 나는 (...)
hmijail

(...) 원래 문구는 gcc 및 clang의 라이센스와 같습니다. 특정 목적을 보장하지 않습니다. 따라서 신뢰성이 필요한 것으로는 사용하지 않고 대신 작업을 위해 특정 언어 (Ada?)로 가지 않는 경우 인증 된 컴파일러를 사용해야합니다.
hmijail

4

Java로 작성된 이유는 내부에 Java 전문 지식이 있으며 C ++이 C ++ 0x / 11과 함께 작동하기 전에 (아직 활발히 개발 중이지만) 작성된 것 같습니다.

그들의 코드는 실제로 이름으로 만 Java이며 sun.misc.Unsafe를 사용하면 Java의 요점을 물리 치고 안전이 제공됩니다. Disruptor의 C ++ 포트를 작성했으며 그들이 제공하는 Java 코드보다 성능이 뛰어납니다 (JVM 튜닝에 많은 시간을 소비하지 않았습니다).

즉, 중단자가 따르는 원칙은 언어에 국한되지 않습니다. 예를 들어 힙에서 할당하거나 해제하는 대기 시간이 짧은 C ++ 코드를 기대하지 마십시오.


구현을 가리킬 수 있습니까? 나는 더 높은 성능을 주장하는 것보다 몇 가지 재 구현을 보았지만 두 가지 모두 단순화되었습니다. Disruptor의 저자는 Google Groups 스레드에서 Java 버전의 매개 변수를 배선하여 성능을 향상시킬 수 있다고 언급했습니다.
hmijail

4

이 질문은 틀린 전제를 사실이라고 말한 다음 그 잘못된 전제에 대해 논쟁을합니다.

"GC 사용을 최소화하기위한 모든 디자인 포인트"는 사실이 아닙니다. 혼란의 혁신은 GC와 거의 관련이 없습니다. 혼란스러운 디자인은 현대 컴퓨터의 작동 방식을 똑똑하게 고려하기 때문에 수행합니다. 예상보다 훨씬 덜 일반적인 것입니다. 자세한 내용은 Cliff Click의 강의 http://www.azulsystems.com/events/javaone_2009/session/2009_J1_HardwareCrashCourse.pdf 를 참조하십시오 .

LMax는 Azul의 고객으로 잘 알려져 있습니다. Azul GC를 사용하면 175GB의 힙에서도 문제가되지 않습니다.


이것에는 진실이 있습니다. 주요 수집을 피하기 위해 매일 밤 VM을 다시 시작합니다. 그것이 마틴 파울러 (Martin Fowler)가 쓴 것입니다. 그는 더미가 아닙니다. "시스템의 나머지 부분과 마찬가지로 방해 요소가 밤새 튀어 오릅니다.이 바운스는 주로 메모리를 지우기 위해 수행되어 거래 중에 값 비싼 가비지 수집 이벤트가 발생할 가능성이 줄어 듭니다." martinfowler.com/articles/lmax.html
JimmyJames

2
좀 빠지는. 우리는 매일 5 분 간의 거래 간격으로 수동 GC를 시작했으며 하루에 유일한 주요 GC가되도록 조정했습니다. 그것은 Azul Zing과 중복되었습니다. (출처 : LMAX에서 최근까지 일했습니다)
Tom Johnson

@TomJohnson 내부 특종을 얻는 것을 좋아합니다. 마틴 파울러의 설명이 틀렸다고 말하는가? 시간이 지남에 따라 솔루션이 발전했을 가능성이 있습니까?
JimmyJames

2
나는 그가 사소한 세부 사항에 대해 정확하게 정확하지 않다고 말하고 있습니다. 우리는 매일 시스템을 반송하지 않았지만 하루 종일 정리 작업을 수행했습니다.
Tom Johnson

3

그들은 저수준생각 해야 할 것입니다

위는 찾고있는 답변의 절반을 만듭니다. LMAX 블로그 에서 추론을 완료 할 다른 절반 을 찾을 수 있습니다 .

매우 효율적이지만 나사를 조이기가 매우 쉽기 때문에 여러 가지 오류가 발생할 수 있습니다.

LMAX 개발자가 인정한 바와 같이 이와 같은 코드는 Java에서도 개발, 이해 및 디버깅이 매우 어려울 수 있습니다. 저수준 프로그래밍 언어 에 대한 Wikipedia 기사에서 지적했듯이 현재 위치보다 낮은 수준으로 나아가면이 문제가 악화 됩니다 .

저수준 언어로 작성된 프로그램은 매우 작은 메모리 공간으로 매우 빠르게 실행되도록 만들 수 있습니다. 고급 언어로 된 동등한 프로그램은 더 무겁습니다. 저급 언어는 간단하지만 기억해야 할 수많은 기술적 세부 사항으로 인해 사용하기 어려운 것으로 간주됩니다 .

이에 비해 고급 프로그래밍 언어 는 컴퓨터 아키텍처의 실행 의미를 프로그램 사양과 분리하여 개발단순화합니다 ...


3

Java를 구문 언어로 사용하고 JDK 라이브러리를 사용하지 않으면 컴파일 된 비 GC 언어만큼 빠를 수 있습니다. GC는 실시간 시스템에는 적합하지 않지만 가비지를 남기지 않는 시스템을 Java로 개발할 수 있습니다. 결과적으로 GC는 트리거되지 않습니다.

우리는 Java 언어와 플랫폼이 C / C ++에 비해 많은 이점을 가지고 있다고 생각하며,이를 증명하기 위해 대기 시간이 짧은 일부 Java 구성 요소를 개발하고 벤치마킹했습니다. 이 기사에서는 GC를 사용하지 않는 Java Development 의 기술에 대해 설명한다 .


2
실시간 시스템에 적합한 가비지 수집기가 있습니다. JVM의 기본 콜렉터가 아닐 수도 있지만 GC가 일반적으로 실시간으로 적합하지 않다는 의미는 아닙니다. 그러나 malloc/free조각화로 인해 할당 시간이 제한되지 않기 때문에 일반 은 실시간에 적합하지 않습니다.
Doval

1
워밍업 후 할당이 발생하지 않도록 모든 것에 빠른 객체 풀 사용을 권장합니다 .
rdalmeida 2016 년

2

LMAX는 고성능 인터 스레드 메시징 라이브러리입니다.

다른 사람이 유용하려면 각 스레드가 유용한 작업을 수행하도록 코드를 작성해야합니다. 코드가 Java 또는 C #에있을 가능성이 높다는 것을 감안할 때 코드와 인터페이스하는 언어 선택은 거의 없습니다.

스레딩 모델이 정의되어 있지 않으므로 사용자를 단일 OS로 제한하지 않는 한 C 또는 C ++를 사용하는 것은 좋은 옵션이 아닙니다.

요즘 Java는 많은 소프트웨어 개발의 표준이므로, 다른 이유가 없다면 최선의 선택이 될 것입니다. (로마에서 로마인처럼 할 때…)

Java (또는 C #)로 고성능 소프트웨어를 작성하는 것은 종종 요점을 증명하기 위해 수행됩니다…


1
새로운 C ++ 11 표준은 멀티 스레딩을 지원합니다.
Casey

@Casey, 그리고 얼마나 많은 실제 C ++ 컴파일러가 그것을 사용합니까? 그리고이 컴파일러 비용은 얼마입니까? 어쩌면 20 년 후에는 그것이 도움이 될 때까지 유용 할 것입니다.
Ian

Disruptor는 sun.misc.Unsafe를 꽤 많이 사용합니다. 이는 발가락을 C 랜드에 담그지 않으면 Java로 지연 시간이 짧은 코드를 실제로 작성할 수 없다는 것을 보여줍니다.
James

3
Gcc는 C ++ 스레드를 지원하며 무료입니다
James

@Ian : 2 년 후 모든 일반적으로 사용되는 컴파일러에서 지원합니다.;). 무료 인 것조차도.
Rutix December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.