낮은 지연 시간 거래 시스템 설계
페이지를 찾을 수 없습니다.
다음을 시도하십시오.
브라우저의 주소 표시 줄에 표시된 웹 사이트 주소의 철자와 형식이 올바른지 확인하십시오. 링크를 클릭하여이 페이지에 도달 한 경우 웹 사이트 관리자에게 연락하여 링크의 형식이 잘못되었음을 알리십시오. 다른 링크를 시도하려면 뒤로 버튼을 클릭하십시오.
HTTP 오류 404 - 파일 또는 디렉토리를 찾을 수 없습니다.
인터넷 정보 서비스 (IIS)
기술 정보 (지원 인력 용)
Microsoft 고객 기술 지원부로 이동하여 HTTP 및 404 단어의 제목 검색을 수행하십시오. IIS 관리자 (inetmgr)에서 액세스 할 수있는 IIS 도움말을 열고 웹 사이트 설치, 일반 관리 작업 및 사용자 지정 오류 메시지 정보 항목을 검색하십시오.
지연이 적은 거래 시스템 설계
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
낮은 대기 시간 프로그래밍.
나는 저 대기 시간 금융 시스템에 대해 많은 것을 읽었으며 (특히 기업 간첩 행위의 유명한 사건 이후), 대기 시간이 짧은 시스템에 대한 아이디어가 내 마음 속에 계속 머물렀다. 이 사람들이하는 일을 사용할 수있는 백만 가지 응용 프로그램이 있으므로이 주제에 대해 더 자세히 알고 싶습니다. 문제는 그 주제에 대해 가치있는 것을 찾을 수 없다는 것입니다. 아무도 도서, 사이트, 저 대기 시간 시스템의 예를 추천 할 수 있습니까?
12 답변.
나는 거래소와 직접 의사 소통하기 위해 지연 시간이 짧은 소프트웨어를 생산하는 금융 회사에서 일하고 있습니다 (거래 및 스트리밍 가격 제출). 우리는 현재 주로 자바로 개발하고 있습니다. 낮은 지연 시간은 직접적으로 작업하는 영역이 아니지만 필요한 스킬 셋에 대한 올바른 생각이 있습니다. 내 생각에는 다음과 같습니다.
불필요한 가비지 수집 (예 : 객체 풀링)을 피하기위한 Java 메모리 모델 및 기술에 대한 자세한 지식. 사용 된 기술 중 일부는 일반적으로 전통적인 OO 환경에서 "반 패턴"으로 간주 될 수 있습니다. 디버깅 및 대기 시간 측정을위한 유틸리티를 포함한 TCP / IP 및 UDP 멀티 캐스트에 대한 자세한 지식 (예 : Solaris의 DTrace). 프로파일 링 응용 프로그램 경험. java. nio 패키지에 대한 지식, NIO 기반의 확장 가능한 서버 애플리케이션 개발 경험, 와이어 프로토콜 설계 경험. 또한 일반적으로 프레임 워크 및 외부 라이브러리 (예 : Google Protobuf)를 사용하지 말고 많은 주문 코드를 작성하는 것을 선호합니다. FIX 및 상용 FIX 라이브러리에 대한 지식 (예 : Cameron FIX).
불행히도 많은 기술은 "일자리"에서만 개발 될 수 있습니다. 사양을 기반으로 가격 서버 또는 거래 엔진을 구현 한 경험을 대체 할 수 없기 때문입니다. 교환 또는 판매 업체로부터. 그러나 우리 회사는 최소한이 (또는 다른) 틈새 분야의 특정 경험을 찾지 않고 대신 우수한 분석 및 문제 해결 기술을 가진 사람들을 고용하는 것을 선호한다는 점을 언급 할 가치가 있습니다.
낮은 대기 시간은 여러 가지 기능으로, 가장 중요한 두 가지 기능은 다음과 같습니다.
네트워크 대기 시간 - 즉 네트워크에서 메시지를 전송 / 수신하는 데 걸리는 시간 처리 대기 시간 - 즉 애플리케이션이 메시지 / 이벤트에 대해 취하는 데 걸리는 시간
따라서 주문 일치 시스템을 작성한다고하면 네트워크 대기 시간은 네트워크에서 주문 일치 요청을받을 수있는 시간을 나타냅니다. 처리 대기 시간은 신청서가 기존의 미결 주문과 비교하여 주문과 일치하는 데 걸리는 시간을 나타냅니다.
Infiniband 네트워크에서 멀티 캐스트, UDP, 신뢰할 수있는 멀티 캐스트, Java 7에서 지원되는 커널 우회, Informatica Ultra Messaging 등은이 분야의 모든 회사에서 사용되는 일반적인 기술입니다.
또한 저 지연 응용 프로그램을 처리하기위한 디자인 패턴을 구현하는 방해 장치 (code. google / p / disruptor /)와 같은 지연 시간이 적은 프로그래밍 프레임 워크가 있습니다. 무엇이 당신을 죽일 수있는 것은 DB 또는 로그 파일을 주 워크 플로우의 일부로 작성해야한다는 것입니다. 해결하려는 문제의 요구 사항을 충족시키는 고유 한 솔루션을 찾아야합니다.
Java와 같은 언어에서는 앱이 가비지가 거의 발생하지 않도록 구현하여 대기 시간이 매우 중요 해집니다. Adamski에 따르면 Java 메모리 모델에 대한 지식은 매우 중요합니다. 다른 JVM 구현과 그 한계를 이해하십시오. 작은 객체 생성에 대한 일반적인 자바 디자인 패턴이 창 밖으로 빠져 나오는 첫 번째 것입니다. 자바 가비지 컬렉터를 수정할 필요가 없으므로 지연 시간을 단축 할 수 있습니다. 해결할 수있는 유일한 방법은 쓰레기입니다.
음, 단순히 "전통적인"실시간 프로그래밍이 아니라 모든 것. 나는 증권 거래소에서 일한다 - 속도는 왕이다. 일반적인 문제는 파일을 쓰는 가장 빠른 방법입니다. 객체를 직렬화하는 가장 빠른 방법은 무엇입니까? 기타
실시간 프로그래밍에 관한 모든 내용이이 법안에 부합 할 것입니다. 그것은 당신이 쫓고있는 것이 정확하지 않다고 생각합니다. 하지만 시작하기에 매우 좋은 곳입니다.
이 게시물에 많은 좋은 답변이 있습니다. 내 경험도 추가하고 싶습니다.
자바에서 낮은 대기 시간을 달성하기 위해서는 자바에서 GC를 제어해야한다. 예를 들어 사전 할당 객체 (예 : 플라이 웨이트 디자인 패턴 사용)를 위해 많은 방법이있다. 원시 객체를 사용한다. 구조는 원시 객체에 기반합니다. 예를 들어, 객체 생성을 줄이기위한 객체 전역 인스턴스 사전 작성을위한 객체 인스턴스 재사용, 스트림 / 소켓 / db에서 데이터를 읽을 때 아주 좋은 옵션입니다.
잠깐 기다리는 프리 고 (조금 어려움)를 사용하고 무료 고문을 잠그십시오. 당신은 그것을위한 많은 예제를 찾을 수 있습니다.
메모리 내 컴퓨팅을 사용하십시오. 메모리가 저렴합니다. 메모리에 테라 바이트의 데이터를 저장할 수 있습니다.
당신이 비트 와이드 알 고를 마스터 할 수 있다면 아주 좋은 성능을 발휘합니다.
mechnical sympathy 사용 - 훌륭한 프레임 워크 인 lmax disruptor를 참조하십시오.
해당 사이트의 백서를 읽으면 짧은 대기 시간 프로그래밍에 필요한 사항을 파악할 수 있습니다.
Java 대기 시간이 적은 개발에 관심이있는 경우 가비지 콜렉터를 제어하는 경우 RTSJ (실시간) JVM없이 수행 할 수 있음을 알아야합니다. GC 오버 헤드없이 Java Development에 대해 이야기하는이 기사를 살펴 보시기 바랍니다. 우리 사이트에는 저 대기 시간 Java 구성 요소에 관한 많은 기사가 있습니다.
저 지연 프로그래밍에 대한 의견을 나누고 싶습니다. 현재 저는 금융 소프트웨어에서 저 지연 및 고 실행 엔진을 개발 한 경험이 5 년 이상 있습니다.
대기 시간이란 무엇인지 이해해야합니까?
대기 시간은 프로세스를 완료하는 데 시간이 필요하다는 것을 의미합니다. 반드시 Java, C ++ 등의 개발 도구에 의존하지는 않습니다. 프로그래밍 기술 및 시스템에 따라 다릅니다.
java를 사용하고 있지만 실수로 한 번 실수로 지연 될 수 있다고 가정합니다. 예를 들어, 모든 가격을 새로 고침 할 때마다 일부 함수를 호출하는 거래 응용 프로그램을 개발했습니다. 이로 인해 여분의 변수, 불필요한 메모리 사용, 불필요한 루프가 생겨 프로세스가 지연 될 수 있습니다. 개발자가 위의 실수에 신경 쓰면 자바에서 개발 한 동일한 응용 프로그램이 더 잘 수행 될 수 있습니다.
그것은 또한 귀하의 응용 프로그램이 멀티 스레드 된 경우 멀티 프로세서 시스템이 잘 수행 할 수있는 것처럼 서버 시스템에 따라 다릅니다.
내가 실시간으로 정확히 기억한다면 자바 (RTSJ)가이 영역에서 사용되지만 좋은 기사를 찾을 수는 없다.
일반적으로 대기 시간이 짧은 환경에서의 작업은 호출 종속성을 이해하고 종속성 체인을 최소화하기 위해 호출 종속성을 줄이는 방법을 의미합니다. 여기에는 데이터 구조와 라이브러리를 사용하여 원하는 캐시 가능 데이터를 저장하는 것은 물론 기존 리소스를 리팩터링하여 상호 의존성을 줄입니다.
지연이 적은 거래 시스템 설계
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
오늘날 첨단 HFT 거래 시스템의 상태는 얼마나 빠릅니까?
항상 고주파 거래 (HFT)에 대해 듣고 알고리즘이 얼마나 지독한 지 알 수 있습니다. 하지만 나는 궁금해합니다. 요즘은 무엇이 빠릅니까?
나는 교환기와 거래 응용 프로그램을 실행하는 서버 사이의 물리적 인 거리에 의해 야기되는 지연에 대해 생각하지 않지만 프로그램 자체에 의해 도입 된 지연에 대해 생각하고 있습니다.
보다 구체적으로 말하자면, 애플리케이션의 전선에 도착한 이벤트가 해당 애플리케이션으로 넘어가면서 전선의 주문 / 가격이 출력되는 시간은? 나는. tick-to-trade 시간.
잠깐 얘기하고 있니? 아니면 서브 마이크로 초입니까?
사람들은 어떻게 이러한 대기 시간을 달성합니까? 어셈블리 코딩? FPGA? 낡은 C ++ 코드?
최근 ACM에 관한 흥미로운 기사가 게재되어 오늘날의 HFT 기술에 대한 많은 세부 정보를 제공합니다.
당신은 아주 좋은 답변을 받았습니다. 한 가지 문제가 있습니다. 대부분의 algotrading은 비밀입니다. 얼마나 빠를 지 간단히 알 수 없습니다. 이것은 양방향으로 진행됩니다. 원하지 않기 때문에 일부는 얼마나 빨리 작동 하는지를 알려주지 못할 수도 있습니다. 다른 사람들은 여러 가지 이유에서 (투자자 또는 고객 유치) "과장"이라고 말하려합니다.
예를 들어, 피코 초에 관한 소문은 다소 터무니 없습니다. 10 나노초와 0.1 나노초는 정확히 똑같습니다. 주문이 거래 서버에 도달하는 데 걸리는 시간이 그 이상입니다.
가장 중요한 것은, 비록 당신이 물어 보지 않았지만, 알고리즘 적으로 거래하려한다면, 더 빨리하려고하지 말고 더 똑똑해 지도록 노력하십시오. 나는 수초의 대기 시간을 다룰 수 있고 많은 돈을 벌 수있는 아주 좋은 알고리즘을 보아왔다.
저는 FPGA 기반 HFT 시스템을 제조하고 판매하는 소규모 회사의 CTO입니다. Solarflare Application Onload Engine (AOE)의 최상위 시스템을 구축하면서 우리는 유선 (ICE 또는 CME의 10Gb / S UDP 시장 데이터 피드)에서 "흥미로운"시장 이벤트에서 대기 시간을 지속적으로 제공 해왔다. 결과 주문 메시지는 750 ~ 800 나노초 범위의 와이어에 부딪칩니다 (예, 서브 마이크로 초). 우리는 다음 버전 시스템이 704 ~ 710 나노초 범위에이를 것으로 예상합니다. 어떤 사람들은 약간은 적다고 주장했지만, 그것은 실험실 환경에 있으며 시카고의 COLO에 실제로 앉아 있지 않고 명령을 정리하지 않았습니다.
물리학 및 "빛의 속도"에 대한 의견은 유효하지만 관련이 없습니다. HFT에 대해 진지한 사람들은 교환 서버 옆의 방에있는 COLO에서 서버를 보유하고 있습니다.
이 서브 마이크로 초 도메인을 이용하려면 커널 바이 패스와 같은 기술을 사용하더라도 FPGA에 대한 피드 전략 구현 명령을 제외하고는 호스트 CPU에서 그다지 많은 일을 할 수 없습니다. 1.5 밀리 초의 피할 수없는 오버 헤드가 있습니다. 그래서이 영역에서는 모든 것이 FPGA로 진행됩니다.
다른 답변들 중 하나는 매우 비밀스러운 시장에서 그들이 사용하는 도구 또는 성능에 대해 이야기하는 사람이 거의 없다는 점에서 매우 정직합니다. 모든 고객은 우리가 도구를 사용한다고 말하지도 않고 사용 방법에 대해 공개하지 않기를 요구합니다. 이것은 마케팅을 어렵게 만들뿐만 아니라 동료 간의 기술적 지식의 흐름을 방해합니다.
시장의 "사악한 빠른"부분을 위해 이국적인 시스템에 들어갈 필요가 있기 때문에 퀀트 (우리가 빠르게 만드는 알고리즘을 생각하는 사람들)는 알 고리를 이벤트 - 투 - 응답 시간 계층. 기술 힙의 맨 위에는 서브 마이크로 초 (우리와 같은) 시스템이 있습니다. 다음 단계는 커널 바이 패스를 많이 사용하는 사용자 정의 C ++ 시스템이며 3-5 마이크로 초 범위입니다. 다음 계층은 10Gb / S 회선에있는 "교환기"에서 단 하나의 라우터 홉이 될 여유가없는 사람들입니다. 그들은 COLO에서 여전히있을 수 있지만 불쾌한 게임 때문에 우리는 "포트 룰렛"이라고 부릅니다. 수십에서 수백 마이크로 초 도메인. 밀리 초 안에 들어가면 더 이상 HFT가 거의 없습니다.
나스닥과 계속 일하기를 원한다면 "40 마이크로 초 이하". 이 수치는 nasdaqomx / technology /
HFT의 상태 (2011 년)가 무엇인지 설명하고 나노초를 달성 할 수있는 하드웨어 솔루션의 샘플을 제공하는 좋은 기사 : Wall Street Need for Trading Speed : Nanosecond Age.
가장 낮은 "대기 시간"에 대한 경쟁이 계속되면서 일부 시장 참여자는 심지어 1 초의 피코 초 (picoseconds)에 대해서도 이야기하고 있습니다.
편집 : 니콜라스 친절하게 언급 :
링크에는 740ns (즉, 입력 이벤트 발생에서 주문 전송까지의 시간)에 "거래 준비"할 수있는 회사 인 Fixnetix가 나와 있습니다.
TIBCO의 FTL 메시징 제품은 한 대의 컴퓨터 (공유 메모리)에서 500 ns 미만이고 데이터 센터에서 RDMA (원격 직접 메모리 액세스)를 사용하는 데 몇 초가 걸립니다. 그 후에 물리학이 방정식의 주요 부분이됩니다.
이것이 데이터를 피드에서 앱으로 가져 와서 결정을 내리는 속도입니다.
적어도 하나의 시스템이 주장했다.
30ns interthread 메시징, 아마도 벤치 마크가 조정 된 것입니다. 따라서 더 낮은 숫자에 대해 이야기하는 사람은 어떤 종류의 마법 CPU를 사용하고 있습니다.
일단 앱에 들어가면 프로그램이 얼마나 빨리 결정을 내릴 수 있는지에 대한 질문 일뿐입니다.
요즘 마이크로 시컨스 (microseconds) 단위의 한 마디 진드기 (tick-to-trade)는 경쟁력있는 HFT 기업의 기준입니다. 소프트웨어 만 사용하면 한 자리 숫자를 높일 수 있어야합니다. 그런 다음 추가 하드웨어로 <5 usec.
고주파 거래는 1998 년 미국 증권 거래위원회 (SEC)가 전자 거래소를 승인 한 후 1999 년 이래로 이루어졌습니다. 21 세기가되면 HFT 거래는 수초의 실행 시간을 갖지만 2010 년까지는 밀리 초 및 심지어 마이크로 초로 감소했습니다.
광속 제한으로 인해 몇 마이크로 초 밖에되지 않을 것입니다. 킬로미터 밖에 떨어져 있지 않은 행운의 소수 만이 그와 가까워지기를 꿈꾸어도됩니다.
또한, 코딩을하지 않아도 물리적으로 이동해야합니다. (300ns 스위치가 달린 기사를 가지고있는 사람은 그 스위치의 대기 시간이 길어집니다!) 구리에서)
저 대기 시간 시스템에 대한 11 가지 우수 사례.
Google이 트래픽이 500 % 감소하고 트래픽이 20 % 감소한 것으로 Google이 알게 된 지 8 년 후인 Amazon은 100ms의 추가 대기 시간으로 매출이 1 % 감소했습니다. 그 이후로 개발자들은 대기 시간 곡선의 맨 아래를 경주하며 프론트 엔드 개발자들이 자바 스크립트, CSS, 심지어는 HTML까지 모든 마지막 밀리 초를 압도하고 있습니다. 다음은 대기 시간이 짧은 시스템을 설계 할 때 명심해야 할 다양한 모범 사례를 통해 무작위로 진행됩니다. 이러한 제안의 대부분은 논리적 인 극단으로 옮겨 지지만 물론 상충 관계가 생길 수 있습니다. (익명의 사용자에게 Quora에 대한 질문을하고 내 생각을 서면으로 작성해 주신 덕분에).
올바른 언어를 선택하십시오.
스크립팅 언어는 적용 할 필요가 없습니다. 계속 빨라지고 빠르지 만 처리 시간에서 지난 몇 밀리 초를 면도 할 때 인터프리터 언어의 오버 헤드를 가질 수 없습니다. 또한 Java, Scala, C ++ 11 또는 Go를 살펴야하므로 잠금없는 프로그래밍을 가능하게하는 강력한 메모리 모델이 필요합니다.
그것을 모두 기억하십시오.
I / O는 대기 시간을 줄이므로 모든 데이터가 메모리에 있는지 확인하십시오. 이것은 일반적으로 자신의 메모리 내 데이터 구조를 관리하고 지속적인 로그를 유지하는 것을 의미하므로 기계 또는 프로세스를 다시 시작한 후에 상태를 다시 작성할 수 있습니다. 영속적 인 로그를위한 몇몇 옵션은 Bitcask, Krati, LevelDB와 BDB-JE를 포함합니다. 또는 redis 또는 MongoDB (메모리 & gt; & gt; 데이터 포함)와 같이 로컬에 저장된 지속적인 메모리 내 데이터베이스를 실행할 수 있습니다. 백그라운드 동기화로 인해 충돌시 데이터가 손실 될 수 있습니다.
데이터와 처리를 동일하게 유지하십시오.
네트워크 홉은 디스크 검색보다 빠르지 만 여전히 많은 오버 헤드가 추가됩니다. 이상적으로는 데이터가 한 호스트의 메모리에 완전히 들어 있어야합니다. AWS가 클라우드에 거의 1/4 TB의 RAM을 제공하고 여러 TB를 제공하는 물리적 서버가 일반적으로 가능합니다. 둘 이상의 호스트에서 실행해야하는 경우 주어진 요청을 서비스하는 데 필요한 모든 데이터가 로컬에서 사용 가능하도록 데이터와 요청이 적절히 분할되어 있는지 확인해야합니다.
시스템을 충분히 활용하지 마십시오.
대기 시간이 짧으면 항상 요청을 처리 할 수있는 리소스가 있어야합니다. 하드웨어 / 소프트웨어가 제공 할 수있는 범위 내에서 실행하려고 시도하지 마십시오. 항상 파열을위한 헤드 룸을 많이 가지고 있습니다.
컨텍스트 스위치를 최소로 유지하십시오.
컨텍스트 스위치는 리소스가있는 것보다 더 많은 계산 작업을 수행한다는 신호입니다. 스레드 수를 시스템의 코어 수로 제한하고 각 스레드를 자체 코어에 고정하려는 것이 좋습니다.
계속 읽기를 유지하십시오.
순차적으로 사용하면 모든 유형의 스토리지가 회전, 플래시 기반 또는 메모리가 크게 향상됩니다. 순차 읽기를 메모리로 발행 할 때 RAM 레벨뿐만 아니라 CPU 캐시 레벨에서도 프리 페치 사용을 트리거합니다. 제대로 완료되면 필요로하는 다음 데이터 조각은 필요할 때마다 항상 L1 캐시에 저장됩니다. 이 프로세스를 돕는 가장 쉬운 방법은 원시 데이터 형식 또는 구조체의 배열을 많이 사용하는 것입니다. 포인터 다음에는 링크 된 목록을 사용하거나 객체 배열을 사용하여 피해야합니다.
일기 쓰기를 배치하십시오.
반 직관적 인 것처럼 들리지만 일괄 쓰기로 인해 성능이 크게 향상 될 수 있습니다. 그러나 이것은 시스템이 쓰기를 수행하기 전에 임의의 시간 동안 대기해야한다는 오해가 있습니다. 대신 하나의 스레드는 I / O를 수행하는 긴밀한 루프에서 회전해야합니다. 각 쓰기는 최종 쓰기가 발행 된 이후에 도착한 모든 데이터를 일괄 처리합니다. 이것은 매우 빠르고 적응력있는 시스템을 만듭니다.
캐시를 존중하십시오.
이러한 최적화가 모두 이루어지면 메모리 액세스가 신속하게 병목 현상이됩니다. 스레드를 자체 코어에 고정하면 CPU 캐시 오염을 줄이고 순차 I / O는 캐시를 미리로드하는 데 도움이됩니다. 그 외에도 기본 데이터 유형을 사용하여 메모리 크기를 줄여야하므로 더 많은 데이터가 캐시에 저장됩니다. 또한 데이터를 캐시에 저장하고 필요한 처리를 수행 할 때까지 반복적으로 데이터를 분할하여 작동하는 캐시 룰 알리지 않는 알고리즘을 조사 할 수 있습니다.
가능한 한 많이 차단하지 않습니다.
블로킹이없는 친구를 만들고 무료 데이터 구조와 알고리즘을 기다리십시오. 자물쇠를 사용할 때마다 거대한 오버 헤드 인 자물쇠를 중재하기 위해 OS에 스택을 내려야합니다. 종종 자신이 무엇을하고 있는지 알면 JVM, C ++ 11 또는 Go의 메모리 모델을 이해하여 잠금을 해제 할 수 있습니다.
최대한 비동기.
모든 처리 및 특히 응답 작성에 절대적으로 필요하지 않은 I / O는 중요한 경로 외부에서 수행해야합니다.
가능한 한 병렬 처리하십시오.
모든 처리와 특히 병렬로 발생할 수있는 I / O는 병렬로 수행해야합니다. 예를 들어 고 가용성 전략에 트랜잭션을 디스크에 로깅하고 트랜잭션을 보조 서버로 전송하는 경우 이러한 작업이 병렬로 발생할 수 있습니다.
거의 모든 것은 LMAX가 Disruptor 프로젝트를 통해 무엇을하고 있는지에 달려 있습니다. 그걸 읽고 Martin Thompson이하는 일을 따르십시오.
이 공유:
관련.
에 의해 출판 됨.
벤자민 다르 플러.
저 지연 시스템을위한 11 가지 우수 사례 & rdquo;
그리고 귀하의 목록에 기쁘게 🙂
좋은 기사. 하나의 쇠고기 : Java 또는 C ++ 11과 같은 정교한 메모리 모델을 가지고 있지 않습니다. 귀하의 시스템이 고 루틴 및 채널 아키텍처에 적합하다면 운이 좋으면 좋습니다. AFAIK 런타임 스케줄러에서 옵트 아웃 할 수 없으므로 원시 OS 스레드 및 (SPSC 대기열 / 링 버퍼)와 같은 자체 잠금없는 데이터 구조를 빌드 할 수있는 기능도 거의 없습니다.
답장을 보내 주셔서 감사합니다. Go 메모리 모델 (golang. org/ref/mem)이 Java 나 C ++ 11만큼 강력하지는 않지만, 여전히 잠금없는 데이터 구조를 사용하여이를 관리 할 수 있다는 인상하에있었습니다. 예를 들어 github / textnode / gringo, github / scryner / lfreequeue 및 github / mocchira / golfhash. 어쩌면 나는 뭔가를 놓친 것일까? 틀림없이 JVM보다 Go에 대한 정보가 훨씬 적다.
Benjamin, Go 메모리 모델은 여기에 자세히 설명되어 있습니다 : golang. org/ref/mem은 주로 채널과 mutex의 관점입니다. 목록에있는 패키지를 살펴 보았고 데이터 구조에 잠금이 설정되어 있지 않은 상태에서 & nbsp; Java / C ++ 11에서 빌드 한 것과 동일하지 않습니다. 현재 동기화 패키지는 완화 된 원자 또는 C ++ 11의 획득 / 릴리스 의미에 대한 지원을 제공하지 않습니다. 이러한 지원이 없으면 SPSC 데이터 구조를 C ++ / Java에서 가능한 것만 큼 효율적으로 구축하기가 어렵습니다. 링크 한 프로젝트는 원자를 사용합니다. 추가 & # 8230; 이것은 순차적으로 일관된 원자이다. XADD로 제작되었으므로 & # 8211; github / tonnerre / golang / blob / master / src / pkg / sync / atomic / asm_amd64.s.
나는 아래로 두드리는 것을 시도하고 있지 않다. 비동기 IO 및 동시 쓰기를위한 최소한의 노력이 필요합니다.
코드는 대부분의 사람들에게 충분히 빠릅니다. std 라이브러리 역시 성능을 위해 매우 잘 조정되어 있습니다. Golang은 또한 Java에서 빠진 구조체를 지원합니다. 그러나 단순한 메모리 모델과 일상적인 런타임은 여러분이 말하는 시스템의 종류를 구축하는 방법에 서 있다고 생각합니다.
깊은 답변을 주셔서 감사합니다. 나는 사람들이 이것을 앞뒤로 유용하게 찾길 바란다.
& # 821; 기본 & # 8217; 언어가 더 좋을 수도 있습니다. 엄격하게 요구되는 것은 아닙니다. Facebook은 우리에게 PHP로 할 수 있음을 보여주었습니다. 미리 컴파일 된 PHP를 HHVM 시스템과 함께 사용한다고합니다. 그러나 그것은 가능합니다!
불행히도 PHP는 여전히 HHVM이 실행 속도를 크게 개선하더라도 수용 가능한 메모리 모델이 부족합니다.
다음 사람만큼 높은 수준의 언어를 사용하기 위해 노력하지만, 사람들이 찾고있는 저 대기 시간 앱을 얻는 유일한 방법은 C와 같은 언어로 드롭 다운하는 것입니다. 언어를 쓰는 것이 어렵습니다. 실행 속도가 빠릅니다.
필자가 링크 된 프로젝트 및 블로그에서 수행중인 작업을 살펴볼 것을 강력히 권장합니다. JVM은 강력한 메모리 모델과 가비지 컬렉션을 제공하여 약하거나 정의되지 않은 메모리 모델 및 메모리 관리를위한 참조 카운터로 거의 또는 전혀 불가능한 잠금없는 프로그래밍을 가능하게하기 때문에 이러한 유형의 시스템에 대한 핫 스폿이되고 있습니다.
나는 Benjamin을 살펴볼 것이다. 그들을 지적 주셔서 감사합니다.
잠금없는 프로그래밍을위한 가비지 콜렉션은 deus 전 machina의 비트입니다. MPMC 및 SPSC 대기열은 모두 GC가 필요없이 구축 될 수 있습니다. 가비지 콜렉션없이 잠금없는 프로그래밍을 수행하는 방법은 많습니다. 참조 카운팅이 유일한 방법은 아닙니다. 위험 포인터, RCU, Proxy-Collector 등은 모두 지연된 교정에 대한 지원을 제공하며 일반적으로 알고리즘 (일반이 아닌)을 지원하므로 일반적으로 쉽게 빌드 할 수 있습니다. 물론 프로덕션 품질 GC는 많은 작업을 필요로하며 지연된 교정 시스템을 코딩하지 않고 덜 숙련 된 프로그래머가 자물쇠없는 알고리즘을 작성하는 데 도움을 줄 것입니다. . 이 분야에서 일하는 일부 링크 : cs. toronto. edu/
예 C / C ++은 최근에 메모리 모델을 얻었지만, 잠금 코드가없는 코드에 대해서는 완전히 부적절하다는 것을 의미하지는 않습니다. GCC 및 다른 고급 컴파일러는 컴파일 된 특정 지시문을 사용하여 정말 오랫동안 지원 플랫폼에서 잠금없는 프로그래밍을 수행했습니다. 그것은 단지 언어로 표준화되지 않았습니다. Linux 및 다른 플랫폼에서도 이러한 프리미티브를 제공했습니다. 자바의 독보적 인 위치는 공식화 된 메모리 모델을 제공했기 때문에 지원되는 모든 플랫폼에서 작동 할 수있었습니다. 원칙적으로 이것은 굉장하지만, 대부분의 서버 측 개발자는 하나의 플랫폼 (Linux / Windows)에서 작동합니다. 그들은 이미 플랫폼 용 잠금 해제 코드를 만드는 도구를 가지고있었습니다.
GC는 훌륭한 도구이지만 꼭 필요한 도구는 아닙니다. 성능 및 복잡성 측면에서 비용이 많이 든다 (STW GC를 피하기 위해 필요한 모든 트릭). C ++ 11 / C11은 이미 적절한 메모리 모델을 지원합니다. 향후 JVM이 Unsafe API를 지원할 책임이 없음을 잊지 마십시오. 안전하지 않은 코드는 & # 8220; 안전하지 않습니다 & # 8221; 따라서 Java의 안전 기능의 이점을 잃게됩니다. 마지막으로 IMO는 메모리를 레이아웃하고 Java에서 구조체를 시뮬레이트하는 데 사용되는 Unsafe 코드가 컴파일러가 신뢰할 수있는 방식으로 작업을 수행하는 C / C ++ 구조체보다 훨씬 못 생겼습니다. C 및 C ++는 또한 PAUSE ins, SSE / AVX / NEON 등과 같은 모든 저수준 플랫폼 전용 전동 공구에 대한 액세스를 제공합니다. 링커 스크립트를 통해 코드 레이아웃을 조정할 수도 있습니다! C / C ++ 툴 체인에서 제공하는 성능은 실제로 JVM과 비교할 수 없습니다. Java는 훌륭한 플랫폼이지만, 가장 일반적인 장점은 일반 비즈니스 로직 (코드의 90 %)이 여전히 GC 및 안전 기능에 의존하고 고도로 조정되고 테스트 된 라이브러리를 사용할 수 있다는 것입니다 안전하지 않은. 이는 퍼포먼스의 마지막 5 %를 얻는 것과 생산성을 높이는 것 사이의 절충점입니다. 트레이드 오프는 많은 사람들에게 타당하지만 트레이드 오프는 그다지 적지 않습니다. 복잡한 애플리케이션 코드를 C / C ++로 작성하는 것은 결국 악몽입니다.
2014 년 3 월 10 일 월요일 오후 12:52에 CodeDependents는 다음과 같이 썼습니다.
& gt; Graham Swan은 다음과 같이 언급했습니다. "나는 Benjamin을 보았습니다. & gt;에 대한 감사합니다. 그 (것)들을 지적하십시오. & # 8221;
누락 된 12 일 : garbadge 수집 언어를 사용하지 마십시오. GC는 최악의 경우 병목입니다. 모든 스레드가 중지 될 가능성이 있습니다. 그것의 글로벌. 이는 건축가가 자신에게 가장 중요한 리소스 (CPU에 가까운 메모리) 중 하나를 관리하도록 혼란스럽게 만듭니다.
실제로 많은 작업이 Java에서 직접 제공됩니다. 잠금 해제 프로그래밍을 제대로하려면 C ++가 최근에 얻은 명확한 메모리 모델이 필요합니다. GC로 작업하는 방법을 알고 있고 그렇지 않은 경우 낮은 대기 시간의 시스템을 훨씬 쉽게 만들 수 있습니다.
나는 벤과 여기에 동의해야한다. 지난 10 년 간 GC 병렬 처리에 대한 많은 진전이있었습니다. G1 수집기가 최신 주문이었습니다. 힙과 여러 가지 손잡이를 조정하여 GC가 거의 멈추지 않도록하려면 약간의 시간이 걸릴 수 있지만 GC가없는 개발자의 시간과 비교하면 알 수 없습니다.
한 단계 더 나아가서 GC를 조작 창 밖으로 쉽게 밀어 넣을 수 있도록 쓰레기를 거의 만들지 않는 시스템을 만들 수도 있습니다. 이것은 JVM에서 실행될 때 모든 고주파 거래 상점이이를 수행하는 방법입니다.
잠금없는 프로그래밍을위한 가비지 콜렉션은 deus 전 machina의 비트입니다. MPMC 및 SPSC 대기열은 모두 GC를 필요로하지 않고 빌드 할 수 있습니다. 가비지 콜렉션없이 잠금없는 프로그래밍을 수행하는 방법은 많습니다. 참조 카운팅이 유일한 방법은 아닙니다. 위험 포인터, RCU, Proxy-Collector 등은 모두 지연된 교정을 지원하고 알고리즘 (일반이 아닌)을 지원하므로 코딩하기가 훨씬 쉽습니다. 물론 프로덕션 품질 GC는 많은 작업을 필요로하며 지연된 교정 시스템을 코딩하지 않고 덜 숙련 된 프로그래머가 자물쇠없는 알고리즘을 작성하는 데 도움을 줄 것입니다. . 이 분야에서 일하는 일부 링크 : cs. toronto. edu/
예 C / C ++은 최근에 메모리 모델을 얻었지만, 잠금 코드가없는 코드에 대해서는 완전히 부적절하다는 것을 의미하지는 않습니다. GCC 및 다른 고급 컴파일러는 컴파일 된 특정 지시문을 사용하여 정말 오랫동안 지원 플랫폼에서 잠금없는 프로그래밍을 수행했습니다. 그것은 단지 언어로 표준화되지 않았습니다. Linux 및 다른 플랫폼에서도 이러한 프리미티브를 제공했습니다. 자바의 독보적 인 위치는 공식화 된 메모리 모델을 제공했기 때문에 지원되는 모든 플랫폼에서 작동 할 수있었습니다. 원칙적으로 이것은 굉장하지만, 대부분의 서버 측 개발자는 하나의 플랫폼 (Linux / Windows)에서 작동합니다. 그들은 이미 플랫폼 용 잠금 해제 코드를 만드는 도구를 가지고있었습니다.
GC는 훌륭한 도구이지만 꼭 필요한 도구는 아닙니다. 성능 및 복잡성 측면에서 비용이 많이 든다 (STW GC를 지연시키고 피하는 데 필요한 모든 트릭). C ++ 11 / C11은 이미 적절한 메모리 모델을 지원합니다. 향후 JVM이 Unsafe API를 지원할 책임이 없음을 잊지 마십시오. 안전하지 않은 코드는 & # 8220; 안전하지 않습니다 & # 8221; 따라서 Java의 안전 기능의 이점을 잃게됩니다. 마지막으로 IMO는 메모리를 레이아웃하고 Java에서 구조체를 시뮬레이트하는 데 사용되는 Unsafe 코드가 컴파일러가 신뢰할 수있는 방식으로 작업을 수행하는 C / C ++ 구조체보다 훨씬 못 생겼습니다. C 및 C ++는 또한 PAUSE ins, SSE / AVX / NEON 등과 같은 모든 저수준 플랫폼 전용 전동 공구에 대한 액세스를 제공합니다. 링커 스크립트를 통해 코드 레이아웃을 조정할 수도 있습니다! C / C ++ 툴 체인에서 제공하는 성능은 실제로 JVM과 비교할 수 없습니다. Java는 훌륭한 플랫폼이지만, 가장 일반적인 장점은 일반 비즈니스 로직 (코드의 90 %)이 여전히 GC 및 안전 기능에 의존하고 고도로 조정되고 테스트 된 라이브러리를 사용할 수 있다는 것입니다 안전하지 않은. 이는 퍼포먼스의 마지막 5 %를 얻는 것과 생산성을 높이는 것 사이의 절충점입니다. 트레이드 오프는 많은 사람들에게 타당하지만 트레이드 오프는 그다지 적지 않습니다. 복잡한 애플리케이션 코드를 C / C ++로 작성하는 것은 결국 악몽입니다.
& gt; garbadge 수집 언어를 사용하지 마십시오.
또는 적어도, 전통적 & # 8221; 가비지 수집 언어. 그들은 다르기 때문에 & # 8211; Erlang도 컬렉터를 가지고 있지만, 세계를 멈추게하지 않기 때문에 병목 현상을 일으키지 않습니다. & # 8221; 자바로 쓰레기를 모으는 중. & # 8211; 대신 작은 개별 마이크로 스레드 (micro-threads)를 중지합니다. 마이크로 초 단위로 표시되므로 큰 눈에 띄지 않습니다.
그 내용을 & # 8220; 전통적인 & # 8221; 가비지 콜렉션 [i] 알고리즘 [/ i]. LMAX에서는 Azul Zing을 사용하고 가비지 콜렉션에 대한 다른 접근법을 사용하는 다른 JVM을 사용하여 주요 GC와 보조 GC가 모두 더 저렴한 비용으로 주문을 받으면서 성능이 크게 향상되었습니다.
그 비용을 상쇄하는 다른 비용이 있습니다. 물론 많은 힙을 사용하고 Zing은 저렴하지 않습니다.
이것을 Java Prorgram의 예와 논평 :
Java 프로그래머를위한 필수 문서 중 하나 인 Java는 10 분 안에 Java에서 대기 시간이 짧은 시스템을 튜닝하고 개발하는 데 많은 시간을 투자 한 후에 배울 교훈입니다.
오래된 스레드를 되살리는, 하지만 (놀랍게도) 이것은 지적되어야합니다 :
1) 상위 레벨 언어 (예 : Java)는 하위 레벨 언어 (예 : C)에서 사용할 수없는 하드웨어에서 기능을 끌어 내지 않습니다. 그렇게 말하면서 '완전히 불가능하다'는 말을 듣는다. Java에서 쉽게 수행 할 수있는 반면 Java는 JVM이 Java에서 필요로하는 기능을 종합해야하지만 실제 하드웨어에서는 제공하지 않는 가상 하드웨어에서 Java가 실행된다는 점을 인정하지 않고 완전한 쓰레기입니다. JVM (예 : C로 작성)이 기능 X를 합성 할 수 있다면 C 프로그래머도 마찬가지입니다.
2) & # 8220; 잠금 해제 & # 8221; 싱글 코어 x86과 같은 특정 환경에서 우연히 만난 것을 제외하고는 사람들이 생각하는 바가 아닙니다. 멀티 코어 x86은 복잡하고 비용이 많이 들지 않는 메모리 장벽없이 자주 잠금을 실행할 수 없습니다. 위의 1에서와 같이 잠금 해제가 주어진 환경에서 작동하면 이는 하드웨어에 의해 지원되거나 가상 환경에서 소프트웨어 에뮬레이트 / 합성되기 때문입니다.
그레이트 포인트 줄리어스. 내가 시도한 (어쩌면 성공적이지 못한) 점은 GC에 의존하기 때문에 C에서 많은 패턴을 적용하기가 어렵다는 것입니다. 단순히 메모리 장벽을 뛰어 넘는 것입니다. 잠금 해제 및 대기 알고리즘을 사용할 때 특히 어려워지는 메모리를 해제하는 것을 고려해야합니다. 이것은 GC가 큰 승리를 가져 오는 곳입니다. 즉, 녹스는 이러한 문제 중 일부를 해결하기 시작할 수있는 메모리 소유에 대한 몇 가지 흥미로운 아이디어가 있다고 들었습니다.
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
오늘날 첨단 HFT 거래 시스템의 상태는 얼마나 빠릅니까?
항상 고주파 거래 (HFT)에 대해 듣고 알고리즘이 얼마나 지독한 지 알 수 있습니다. 하지만 나는 궁금해합니다. 요즘은 무엇이 빠릅니까?
나는 교환기와 거래 응용 프로그램을 실행하는 서버 사이의 물리적 인 거리에 의해 야기되는 지연에 대해 생각하지 않지만 프로그램 자체에 의해 도입 된 지연에 대해 생각하고 있습니다.
보다 구체적으로 말하자면, 애플리케이션의 전선에 도착한 이벤트가 해당 애플리케이션으로 넘어가면서 전선의 주문 / 가격이 출력되는 시간은? 나는. tick-to-trade 시간.
잠깐 얘기하고 있니? 아니면 서브 마이크로 초입니까?
사람들은 어떻게 이러한 대기 시간을 달성합니까? 어셈블리 코딩? FPGA? 낡은 C ++ 코드?
최근 ACM에 관한 흥미로운 기사가 게재되어 오늘날의 HFT 기술에 대한 많은 세부 정보를 제공합니다.
당신은 아주 좋은 답변을 받았습니다. 한 가지 문제가 있습니다. 대부분의 algotrading은 비밀입니다. 얼마나 빠를 지 간단히 알 수 없습니다. 이것은 양방향으로 진행됩니다. 원하지 않기 때문에 일부는 얼마나 빨리 작동 하는지를 알려주지 못할 수도 있습니다. 다른 사람들은 여러 가지 이유에서 (투자자 또는 고객 유치) "과장"이라고 말하려합니다.
예를 들어, 피코 초에 관한 소문은 다소 터무니 없습니다. 10 나노초와 0.1 나노초는 정확히 똑같습니다. 주문이 거래 서버에 도달하는 데 걸리는 시간이 그 이상입니다.
가장 중요한 것은, 비록 당신이 물어 보지 않았지만, 알고리즘 적으로 거래하려한다면, 더 빨리하려고하지 말고 더 똑똑해 지도록 노력하십시오. 나는 수초의 대기 시간을 다룰 수 있고 많은 돈을 벌 수있는 아주 좋은 알고리즘을 보아왔다.
저는 FPGA 기반 HFT 시스템을 제조하고 판매하는 소규모 회사의 CTO입니다. Solarflare Application Onload Engine (AOE)의 최상위 시스템을 구축하면서 우리는 유선 (ICE 또는 CME의 10Gb / S UDP 시장 데이터 피드)에서 "흥미로운"시장 이벤트에서 대기 시간을 지속적으로 제공 해왔다. 결과 주문 메시지는 750 ~ 800 나노초 범위의 와이어에 부딪칩니다 (예, 서브 마이크로 초). 우리는 다음 버전 시스템이 704 ~ 710 나노초 범위에이를 것으로 예상합니다. 어떤 사람들은 약간은 적다고 주장했지만, 그것은 실험실 환경에 있으며 시카고의 COLO에 실제로 앉아 있지 않고 명령을 정리하지 않았습니다.
물리학 및 "빛의 속도"에 대한 의견은 유효하지만 관련이 없습니다. HFT에 대해 진지한 사람들은 교환 서버 옆의 방에있는 COLO에서 서버를 보유하고 있습니다.
이 서브 마이크로 초 도메인을 이용하려면 커널 바이 패스와 같은 기술을 사용하더라도 FPGA에 대한 피드 전략 구현 명령을 제외하고는 호스트 CPU에서 그다지 많은 일을 할 수 없습니다. 1.5 밀리 초의 피할 수없는 오버 헤드가 있습니다. 그래서이 영역에서는 모든 것이 FPGA로 진행됩니다.
다른 답변들 중 하나는 매우 비밀스러운 시장에서 그들이 사용하는 도구 또는 성능에 대해 이야기하는 사람이 거의 없다는 점에서 매우 정직합니다. 모든 고객은 우리가 도구를 사용한다고 말하지도 않고 사용 방법에 대해 공개하지 않기를 요구합니다. 이것은 마케팅을 어렵게 만들뿐만 아니라 동료 간의 기술적 지식의 흐름을 방해합니다.
시장의 "사악한 빠른"부분을 위해 이국적인 시스템에 들어갈 필요가 있기 때문에 퀀트 (우리가 빠르게 만드는 알고리즘을 생각하는 사람들)는 알 고리를 이벤트 - 투 - 응답 시간 계층. 기술 힙의 맨 위에는 서브 마이크로 초 (우리와 같은) 시스템이 있습니다. 다음 단계는 커널 바이 패스를 많이 사용하는 사용자 정의 C ++ 시스템이며 3-5 마이크로 초 범위입니다. 다음 계층은 10Gb / S 회선에있는 "교환기"에서 단 하나의 라우터 홉이 될 여유가없는 사람들입니다. 그들은 COLO에서 여전히있을 수 있지만 불쾌한 게임 때문에 우리는 "포트 룰렛"이라고 부릅니다. 수십에서 수백 마이크로 초 도메인. 밀리 초 안에 들어가면 더 이상 HFT가 거의 없습니다.
나스닥과 계속 일하기를 원한다면 "40 마이크로 초 이하". 이 수치는 nasdaqomx / technology /
HFT의 상태 (2011 년)가 무엇인지 설명하고 나노초를 달성 할 수있는 하드웨어 솔루션의 샘플을 제공하는 좋은 기사 : Wall Street Need for Trading Speed : Nanosecond Age.
가장 낮은 "대기 시간"에 대한 경쟁이 계속되면서 일부 시장 참여자는 심지어 1 초의 피코 초 (picoseconds)에 대해서도 이야기하고 있습니다.
편집 : 니콜라스 친절하게 언급 :
링크에는 740ns (즉, 입력 이벤트 발생에서 주문 전송까지의 시간)에 "거래 준비"할 수있는 회사 인 Fixnetix가 나와 있습니다.
TIBCO의 FTL 메시징 제품은 한 대의 컴퓨터 (공유 메모리)에서 500 ns 미만이고 데이터 센터에서 RDMA (원격 직접 메모리 액세스)를 사용하는 데 몇 초가 걸립니다. 그 후에 물리학이 방정식의 주요 부분이됩니다.
이것이 데이터를 피드에서 앱으로 가져 와서 결정을 내리는 속도입니다.
적어도 하나의 시스템이 주장했다.
30ns interthread 메시징, 아마도 벤치 마크가 조정 된 것입니다. 따라서 더 낮은 숫자에 대해 이야기하는 사람은 어떤 종류의 마법 CPU를 사용하고 있습니다.
일단 앱에 들어가면 프로그램이 얼마나 빨리 결정을 내릴 수 있는지에 대한 질문 일뿐입니다.
요즘 마이크로 시컨스 (microseconds) 단위의 한 마디 진드기 (tick-to-trade)는 경쟁력있는 HFT 기업의 기준입니다. 소프트웨어 만 사용하면 한 자리 숫자를 높일 수 있어야합니다. 그런 다음 추가 하드웨어로 <5 usec.
고주파 거래는 1998 년 미국 증권 거래위원회 (SEC)가 전자 거래소를 승인 한 후 1999 년 이래로 이루어졌습니다. 21 세기가되면 HFT 거래는 수초의 실행 시간을 갖지만 2010 년까지는 밀리 초 및 심지어 마이크로 초로 감소했습니다.
광속 제한으로 인해 몇 마이크로 초 밖에되지 않을 것입니다. 킬로미터 밖에 떨어져 있지 않은 행운의 소수 만이 그와 가까워지기를 꿈꾸어도됩니다.
또한, 코딩을하지 않아도 물리적으로 이동해야합니다. (300ns 스위치가 달린 기사를 가지고있는 사람은 그 스위치의 대기 시간이 길어집니다!) 구리에서)
저 대기 시간 시스템에 대한 11 가지 우수 사례.
Google이 트래픽이 500 % 감소하고 트래픽이 20 % 감소한 것으로 Google이 알게 된 지 8 년 후인 Amazon은 100ms의 추가 대기 시간으로 매출이 1 % 감소했습니다. 그 이후로 개발자들은 대기 시간 곡선의 맨 아래를 경주하며 프론트 엔드 개발자들이 자바 스크립트, CSS, 심지어는 HTML까지 모든 마지막 밀리 초를 압도하고 있습니다. 다음은 대기 시간이 짧은 시스템을 설계 할 때 명심해야 할 다양한 모범 사례를 통해 무작위로 진행됩니다. 이러한 제안의 대부분은 논리적 인 극단으로 옮겨 지지만 물론 상충 관계가 생길 수 있습니다. (익명의 사용자에게 Quora에 대한 질문을하고 내 생각을 서면으로 작성해 주신 덕분에).
올바른 언어를 선택하십시오.
스크립팅 언어는 적용 할 필요가 없습니다. 계속 빨라지고 빠르지 만 처리 시간에서 지난 몇 밀리 초를 면도 할 때 인터프리터 언어의 오버 헤드를 가질 수 없습니다. 또한 Java, Scala, C ++ 11 또는 Go를 살펴야하므로 잠금없는 프로그래밍을 가능하게하는 강력한 메모리 모델이 필요합니다.
그것을 모두 기억하십시오.
I / O는 대기 시간을 줄이므로 모든 데이터가 메모리에 있는지 확인하십시오. 이것은 일반적으로 자신의 메모리 내 데이터 구조를 관리하고 지속적인 로그를 유지하는 것을 의미하므로 기계 또는 프로세스를 다시 시작한 후에 상태를 다시 작성할 수 있습니다. 영속적 인 로그를위한 몇몇 옵션은 Bitcask, Krati, LevelDB와 BDB-JE를 포함합니다. 또는 redis 또는 MongoDB (메모리 & gt; & gt; 데이터 포함)와 같이 로컬에 저장된 지속적인 메모리 내 데이터베이스를 실행할 수 있습니다. 백그라운드 동기화로 인해 충돌시 데이터가 손실 될 수 있습니다.
데이터와 처리를 동일하게 유지하십시오.
네트워크 홉은 디스크 검색보다 빠르지 만 여전히 많은 오버 헤드가 추가됩니다. 이상적으로는 데이터가 한 호스트의 메모리에 완전히 들어 있어야합니다. AWS가 클라우드에 거의 1/4 TB의 RAM을 제공하고 여러 TB를 제공하는 물리적 서버가 일반적으로 가능합니다. 둘 이상의 호스트에서 실행해야하는 경우 주어진 요청을 서비스하는 데 필요한 모든 데이터가 로컬에서 사용 가능하도록 데이터와 요청이 적절히 분할되어 있는지 확인해야합니다.
시스템을 충분히 활용하지 마십시오.
대기 시간이 짧으면 항상 요청을 처리 할 수있는 리소스가 있어야합니다. 하드웨어 / 소프트웨어가 제공 할 수있는 범위 내에서 실행하려고 시도하지 마십시오. 항상 파열을위한 헤드 룸을 많이 가지고 있습니다.
컨텍스트 스위치를 최소로 유지하십시오.
컨텍스트 스위치는 리소스가있는 것보다 더 많은 계산 작업을 수행한다는 신호입니다. 스레드 수를 시스템의 코어 수로 제한하고 각 스레드를 자체 코어에 고정하려는 것이 좋습니다.
계속 읽기를 유지하십시오.
순차적으로 사용하면 모든 유형의 스토리지가 회전, 플래시 기반 또는 메모리가 크게 향상됩니다. 순차 읽기를 메모리로 발행 할 때 RAM 레벨뿐만 아니라 CPU 캐시 레벨에서도 프리 페치 사용을 트리거합니다. 제대로 완료되면 필요로하는 다음 데이터 조각은 필요할 때마다 항상 L1 캐시에 저장됩니다. 이 프로세스를 돕는 가장 쉬운 방법은 원시 데이터 형식 또는 구조체의 배열을 많이 사용하는 것입니다. 포인터 다음에는 링크 된 목록을 사용하거나 객체 배열을 사용하여 피해야합니다.
일기 쓰기를 배치하십시오.
반 직관적 인 것처럼 들리지만 일괄 쓰기로 인해 성능이 크게 향상 될 수 있습니다. 그러나 이것은 시스템이 쓰기를 수행하기 전에 임의의 시간 동안 대기해야한다는 오해가 있습니다. 대신 하나의 스레드는 I / O를 수행하는 긴밀한 루프에서 회전해야합니다. 각 쓰기는 최종 쓰기가 발행 된 이후에 도착한 모든 데이터를 일괄 처리합니다. 이것은 매우 빠르고 적응력있는 시스템을 만듭니다.
캐시를 존중하십시오.
이러한 최적화가 모두 이루어지면 메모리 액세스가 신속하게 병목 현상이됩니다. 스레드를 자체 코어에 고정하면 CPU 캐시 오염을 줄이고 순차 I / O는 캐시를 미리로드하는 데 도움이됩니다. 그 외에도 기본 데이터 유형을 사용하여 메모리 크기를 줄여야하므로 더 많은 데이터가 캐시에 저장됩니다. 또한 데이터를 캐시에 저장하고 필요한 처리를 수행 할 때까지 반복적으로 데이터를 분할하여 작동하는 캐시 룰 알리지 않는 알고리즘을 조사 할 수 있습니다.
가능한 한 많이 차단하지 않습니다.
블로킹이없는 친구를 만들고 무료 데이터 구조와 알고리즘을 기다리십시오. 자물쇠를 사용할 때마다 거대한 오버 헤드 인 자물쇠를 중재하기 위해 OS에 스택을 내려야합니다. 종종 자신이 무엇을하고 있는지 알면 JVM, C ++ 11 또는 Go의 메모리 모델을 이해하여 잠금을 해제 할 수 있습니다.
최대한 비동기.
모든 처리 및 특히 응답 작성에 절대적으로 필요하지 않은 I / O는 중요한 경로 외부에서 수행해야합니다.
가능한 한 병렬 처리하십시오.
모든 처리와 특히 병렬로 발생할 수있는 I / O는 병렬로 수행해야합니다. 예를 들어 고 가용성 전략에 트랜잭션을 디스크에 로깅하고 트랜잭션을 보조 서버로 전송하는 경우 이러한 작업이 병렬로 발생할 수 있습니다.
거의 모든 것은 LMAX가 Disruptor 프로젝트를 통해 무엇을하고 있는지에 달려 있습니다. 그걸 읽고 Martin Thompson이하는 일을 따르십시오.
이 공유:
관련.
에 의해 출판 됨.
벤자민 다르 플러.
저 지연 시스템을위한 11 가지 우수 사례 & rdquo;
그리고 귀하의 목록에 기쁘게 🙂
좋은 기사. 하나의 쇠고기 : Java 또는 C ++ 11과 같은 정교한 메모리 모델을 가지고 있지 않습니다. 귀하의 시스템이 고 루틴 및 채널 아키텍처에 적합하다면 운이 좋으면 좋습니다. AFAIK 런타임 스케줄러에서 옵트 아웃 할 수 없으므로 원시 OS 스레드 및 (SPSC 대기열 / 링 버퍼)와 같은 자체 잠금없는 데이터 구조를 빌드 할 수있는 기능도 거의 없습니다.
답장을 보내 주셔서 감사합니다. Go 메모리 모델 (golang. org/ref/mem)이 Java 나 C ++ 11만큼 강력하지는 않지만, 여전히 잠금없는 데이터 구조를 사용하여이를 관리 할 수 있다는 인상하에있었습니다. 예를 들어 github / textnode / gringo, github / scryner / lfreequeue 및 github / mocchira / golfhash. 어쩌면 나는 뭔가를 놓친 것일까? 틀림없이 JVM보다 Go에 대한 정보가 훨씬 적다.
Benjamin, Go 메모리 모델은 여기에 자세히 설명되어 있습니다 : golang. org/ref/mem은 주로 채널과 mutex의 관점입니다. 목록에있는 패키지를 살펴 보았고 데이터 구조에 잠금이 설정되어 있지 않은 상태에서 & nbsp; Java / C ++ 11에서 빌드 한 것과 동일하지 않습니다. 현재 동기화 패키지는 완화 된 원자 또는 C ++ 11의 획득 / 릴리스 의미에 대한 지원을 제공하지 않습니다. 이러한 지원이 없으면 SPSC 데이터 구조를 C ++ / Java에서 가능한 것만 큼 효율적으로 구축하기가 어렵습니다. 링크 한 프로젝트는 원자를 사용합니다. 추가 & # 8230; 이것은 순차적으로 일관된 원자이다. XADD로 제작되었으므로 & # 8211; github / tonnerre / golang / blob / master / src / pkg / sync / atomic / asm_amd64.s.
나는 아래로 두드리는 것을 시도하고 있지 않다. 비동기 IO 및 동시 쓰기를위한 최소한의 노력이 필요합니다.
코드는 대부분의 사람들에게 충분히 빠릅니다. std 라이브러리 역시 성능을 위해 매우 잘 조정되어 있습니다. Golang은 또한 Java에서 빠진 구조체를 지원합니다. 그러나 단순한 메모리 모델과 일상적인 런타임은 여러분이 말하는 시스템의 종류를 구축하는 방법에 서 있다고 생각합니다.
깊은 답변을 주셔서 감사합니다. 나는 사람들이 이것을 앞뒤로 유용하게 찾길 바란다.
& # 821; 기본 & # 8217; 언어가 더 좋을 수도 있습니다. 엄격하게 요구되는 것은 아닙니다. Facebook은 우리에게 PHP로 할 수 있음을 보여주었습니다. 미리 컴파일 된 PHP를 HHVM 시스템과 함께 사용한다고합니다. 그러나 그것은 가능합니다!
불행히도 PHP는 여전히 HHVM이 실행 속도를 크게 개선하더라도 수용 가능한 메모리 모델이 부족합니다.
다음 사람만큼 높은 수준의 언어를 사용하기 위해 노력하지만, 사람들이 찾고있는 저 대기 시간 앱을 얻는 유일한 방법은 C와 같은 언어로 드롭 다운하는 것입니다. 언어를 쓰는 것이 어렵습니다. 실행 속도가 빠릅니다.
필자가 링크 된 프로젝트 및 블로그에서 수행중인 작업을 살펴볼 것을 강력히 권장합니다. JVM은 강력한 메모리 모델과 가비지 컬렉션을 제공하여 약하거나 정의되지 않은 메모리 모델 및 메모리 관리를위한 참조 카운터로 거의 또는 전혀 불가능한 잠금없는 프로그래밍을 가능하게하기 때문에 이러한 유형의 시스템에 대한 핫 스폿이되고 있습니다.
나는 Benjamin을 살펴볼 것이다. 그들을 지적 주셔서 감사합니다.
잠금없는 프로그래밍을위한 가비지 콜렉션은 deus 전 machina의 비트입니다. MPMC 및 SPSC 대기열은 모두 GC가 필요없이 구축 될 수 있습니다. 가비지 콜렉션없이 잠금없는 프로그래밍을 수행하는 방법은 많습니다. 참조 카운팅이 유일한 방법은 아닙니다. 위험 포인터, RCU, Proxy-Collector 등은 모두 지연된 교정에 대한 지원을 제공하며 일반적으로 알고리즘 (일반이 아닌)을 지원하므로 일반적으로 쉽게 빌드 할 수 있습니다. 물론 프로덕션 품질 GC는 많은 작업을 필요로하며 지연된 교정 시스템을 코딩하지 않고 덜 숙련 된 프로그래머가 자물쇠없는 알고리즘을 작성하는 데 도움을 줄 것입니다. . 이 분야에서 일하는 일부 링크 : cs. toronto. edu/
예 C / C ++은 최근에 메모리 모델을 얻었지만, 잠금 코드가없는 코드에 대해서는 완전히 부적절하다는 것을 의미하지는 않습니다. GCC 및 다른 고급 컴파일러는 컴파일 된 특정 지시문을 사용하여 정말 오랫동안 지원 플랫폼에서 잠금없는 프로그래밍을 수행했습니다. 그것은 단지 언어로 표준화되지 않았습니다. Linux 및 다른 플랫폼에서도 이러한 프리미티브를 제공했습니다. 자바의 독보적 인 위치는 공식화 된 메모리 모델을 제공했기 때문에 지원되는 모든 플랫폼에서 작동 할 수있었습니다. 원칙적으로 이것은 굉장하지만, 대부분의 서버 측 개발자는 하나의 플랫폼 (Linux / Windows)에서 작동합니다. 그들은 이미 플랫폼 용 잠금 해제 코드를 만드는 도구를 가지고있었습니다.
GC는 훌륭한 도구이지만 꼭 필요한 도구는 아닙니다. 성능 및 복잡성 측면에서 비용이 많이 든다 (STW GC를 피하기 위해 필요한 모든 트릭). C ++ 11 / C11은 이미 적절한 메모리 모델을 지원합니다. 향후 JVM이 Unsafe API를 지원할 책임이 없음을 잊지 마십시오. 안전하지 않은 코드는 & # 8220; 안전하지 않습니다 & # 8221; 따라서 Java의 안전 기능의 이점을 잃게됩니다. 마지막으로 IMO는 메모리를 레이아웃하고 Java에서 구조체를 시뮬레이트하는 데 사용되는 Unsafe 코드가 컴파일러가 신뢰할 수있는 방식으로 작업을 수행하는 C / C ++ 구조체보다 훨씬 못 생겼습니다. C 및 C ++는 또한 PAUSE ins, SSE / AVX / NEON 등과 같은 모든 저수준 플랫폼 전용 전동 공구에 대한 액세스를 제공합니다. 링커 스크립트를 통해 코드 레이아웃을 조정할 수도 있습니다! C / C ++ 툴 체인에서 제공하는 성능은 실제로 JVM과 비교할 수 없습니다. Java는 훌륭한 플랫폼이지만, 가장 일반적인 장점은 일반 비즈니스 로직 (코드의 90 %)이 여전히 GC 및 안전 기능에 의존하고 고도로 조정되고 테스트 된 라이브러리를 사용할 수 있다는 것입니다 안전하지 않은. 이는 퍼포먼스의 마지막 5 %를 얻는 것과 생산성을 높이는 것 사이의 절충점입니다. 트레이드 오프는 많은 사람들에게 타당하지만 트레이드 오프는 그다지 적지 않습니다. 복잡한 애플리케이션 코드를 C / C ++로 작성하는 것은 결국 악몽입니다.
2014 년 3 월 10 일 월요일 오후 12:52에 CodeDependents는 다음과 같이 썼습니다.
& gt; Graham Swan은 다음과 같이 언급했습니다. "나는 Benjamin을 보았습니다. & gt;에 대한 감사합니다. 그 (것)들을 지적하십시오. & # 8221;
누락 된 12 일 : garbadge 수집 언어를 사용하지 마십시오. GC는 최악의 경우 병목입니다. 모든 스레드가 중지 될 가능성이 있습니다. 그것의 글로벌. 이는 건축가가 자신에게 가장 중요한 리소스 (CPU에 가까운 메모리) 중 하나를 관리하도록 혼란스럽게 만듭니다.
실제로 많은 작업이 Java에서 직접 제공됩니다. 잠금 해제 프로그래밍을 제대로하려면 C ++가 최근에 얻은 명확한 메모리 모델이 필요합니다. GC로 작업하는 방법을 알고 있고 그렇지 않은 경우 낮은 대기 시간의 시스템을 훨씬 쉽게 만들 수 있습니다.
나는 벤과 여기에 동의해야한다. 지난 10 년 간 GC 병렬 처리에 대한 많은 진전이있었습니다. G1 수집기가 최신 주문이었습니다. 힙과 여러 가지 손잡이를 조정하여 GC가 거의 멈추지 않도록하려면 약간의 시간이 걸릴 수 있지만 GC가없는 개발자의 시간과 비교하면 알 수 없습니다.
한 단계 더 나아가서 GC를 조작 창 밖으로 쉽게 밀어 넣을 수 있도록 쓰레기를 거의 만들지 않는 시스템을 만들 수도 있습니다. 이것은 JVM에서 실행될 때 모든 고주파 거래 상점이이를 수행하는 방법입니다.
잠금없는 프로그래밍을위한 가비지 콜렉션은 deus 전 machina의 비트입니다. MPMC 및 SPSC 대기열은 모두 GC를 필요로하지 않고 빌드 할 수 있습니다. 가비지 콜렉션없이 잠금없는 프로그래밍을 수행하는 방법은 많습니다. 참조 카운팅이 유일한 방법은 아닙니다. 위험 포인터, RCU, Proxy-Collector 등은 모두 지연된 교정을 지원하고 알고리즘 (일반이 아닌)을 지원하므로 코딩하기가 훨씬 쉽습니다. 물론 프로덕션 품질 GC는 많은 작업을 필요로하며 지연된 교정 시스템을 코딩하지 않고 덜 숙련 된 프로그래머가 자물쇠없는 알고리즘을 작성하는 데 도움을 줄 것입니다. . 이 분야에서 일하는 일부 링크 : cs. toronto. edu/
예 C / C ++은 최근에 메모리 모델을 얻었지만, 잠금 코드가없는 코드에 대해서는 완전히 부적절하다는 것을 의미하지는 않습니다. GCC 및 다른 고급 컴파일러는 컴파일 된 특정 지시문을 사용하여 정말 오랫동안 지원 플랫폼에서 잠금없는 프로그래밍을 수행했습니다. 그것은 단지 언어로 표준화되지 않았습니다. Linux 및 다른 플랫폼에서도 이러한 프리미티브를 제공했습니다. 자바의 독보적 인 위치는 공식화 된 메모리 모델을 제공했기 때문에 지원되는 모든 플랫폼에서 작동 할 수있었습니다. 원칙적으로 이것은 굉장하지만, 대부분의 서버 측 개발자는 하나의 플랫폼 (Linux / Windows)에서 작동합니다. 그들은 이미 플랫폼 용 잠금 해제 코드를 만드는 도구를 가지고있었습니다.
GC는 훌륭한 도구이지만 꼭 필요한 도구는 아닙니다. 성능 및 복잡성 측면에서 비용이 많이 든다 (STW GC를 지연시키고 피하는 데 필요한 모든 트릭). C ++ 11 / C11은 이미 적절한 메모리 모델을 지원합니다. 향후 JVM이 Unsafe API를 지원할 책임이 없음을 잊지 마십시오. 안전하지 않은 코드는 & # 8220; 안전하지 않습니다 & # 8221; 따라서 Java의 안전 기능의 이점을 잃게됩니다. 마지막으로 IMO는 메모리를 레이아웃하고 Java에서 구조체를 시뮬레이트하는 데 사용되는 Unsafe 코드가 컴파일러가 신뢰할 수있는 방식으로 작업을 수행하는 C / C ++ 구조체보다 훨씬 못 생겼습니다. C 및 C ++는 또한 PAUSE ins, SSE / AVX / NEON 등과 같은 모든 저수준 플랫폼 전용 전동 공구에 대한 액세스를 제공합니다. 링커 스크립트를 통해 코드 레이아웃을 조정할 수도 있습니다! C / C ++ 툴 체인에서 제공하는 성능은 실제로 JVM과 비교할 수 없습니다. Java는 훌륭한 플랫폼이지만, 가장 일반적인 장점은 일반 비즈니스 로직 (코드의 90 %)이 여전히 GC 및 안전 기능에 의존하고 고도로 조정되고 테스트 된 라이브러리를 사용할 수 있다는 것입니다 안전하지 않은. 이는 퍼포먼스의 마지막 5 %를 얻는 것과 생산성을 높이는 것 사이의 절충점입니다. 트레이드 오프는 많은 사람들에게 타당하지만 트레이드 오프는 그다지 적지 않습니다. 복잡한 애플리케이션 코드를 C / C ++로 작성하는 것은 결국 악몽입니다.
& gt; garbadge 수집 언어를 사용하지 마십시오.
또는 적어도, 전통적 & # 8221; 가비지 수집 언어. 그들은 다르기 때문에 & # 8211; Erlang도 컬렉터를 가지고 있지만, 세계를 멈추게하지 않기 때문에 병목 현상을 일으키지 않습니다. & # 8221; 자바로 쓰레기를 모으는 중. & # 8211; 대신 작은 개별 마이크로 스레드 (micro-threads)를 중지합니다. 마이크로 초 단위로 표시되므로 큰 눈에 띄지 않습니다.
그 내용을 & # 8220; 전통적인 & # 8221; 가비지 콜렉션 [i] 알고리즘 [/ i]. LMAX에서는 Azul Zing을 사용하고 가비지 콜렉션에 대한 다른 접근법을 사용하는 다른 JVM을 사용하여 주요 GC와 보조 GC가 모두 더 저렴한 비용으로 주문을 받으면서 성능이 크게 향상되었습니다.
그 비용을 상쇄하는 다른 비용이 있습니다. 물론 많은 힙을 사용하고 Zing은 저렴하지 않습니다.
이것을 Java Prorgram의 예와 논평 :
Java 프로그래머를위한 필수 문서 중 하나 인 Java는 10 분 안에 Java에서 대기 시간이 짧은 시스템을 튜닝하고 개발하는 데 많은 시간을 투자 한 후에 배울 교훈입니다.
오래된 스레드를 되살리는, 하지만 (놀랍게도) 이것은 지적되어야합니다 :
1) 상위 레벨 언어 (예 : Java)는 하위 레벨 언어 (예 : C)에서 사용할 수없는 하드웨어에서 기능을 끌어 내지 않습니다. 그렇게 말하면서 '완전히 불가능하다'는 말을 듣는다. Java에서 쉽게 수행 할 수있는 반면 Java는 JVM이 Java에서 필요로하는 기능을 종합해야하지만 실제 하드웨어에서는 제공하지 않는 가상 하드웨어에서 Java가 실행된다는 점을 인정하지 않고 완전한 쓰레기입니다. JVM (예 : C로 작성)이 기능 X를 합성 할 수 있다면 C 프로그래머도 마찬가지입니다.
2) & # 8220; 잠금 해제 & # 8221; 싱글 코어 x86과 같은 특정 환경에서 우연히 만난 것을 제외하고는 사람들이 생각하는 바가 아닙니다. 멀티 코어 x86은 복잡하고 비용이 많이 들지 않는 메모리 장벽없이 자주 잠금을 실행할 수 없습니다. 위의 1에서와 같이 잠금 해제가 주어진 환경에서 작동하면 이는 하드웨어에 의해 지원되거나 가상 환경에서 소프트웨어 에뮬레이트 / 합성되기 때문입니다.
그레이트 포인트 줄리어스. 내가 시도한 (어쩌면 성공적이지 못한) 점은 GC에 의존하기 때문에 C에서 많은 패턴을 적용하기가 어렵다는 것입니다. 단순히 메모리 장벽을 뛰어 넘는 것입니다. 잠금 해제 및 대기 알고리즘을 사용할 때 특히 어려워지는 메모리를 해제하는 것을 고려해야합니다. 이것은 GC가 큰 승리를 가져 오는 곳입니다. 즉, 녹스는 이러한 문제 중 일부를 해결하기 시작할 수있는 메모리 소유에 대한 몇 가지 흥미로운 아이디어가 있다고 들었습니다.
Comments
Post a Comment