1.
요즘 RSS로 올라오는 글을 보면 트레이딩의 흐름이 보입니다. 구글 리더부터 시작하여 현재 설치형 RSS서버에 이르기까지 흐름을 보면 2013년 여름을 전후한 때부터 Low Latency와 관련한 글을 자취를 감추었습니다. Low Latency Technology를 주제로 글을 쓰던 블로그나 기사들이 뜸해지면서 ‘데이타’에 촛점을 둔 기사가 주류를 이룹니다. 특히나 R이나 Python을 이용한 데이타 분석을 주제로 한 글은 넘칩니다. 제 블로그도 이런 흐름에 영향을 받지 않을 수 없습니다. 트레이더들의 관심이나 흐름에 안테나를 세우고 있는 저로써는 당연합니다.
Low Latency와 관련한 글을 쓰면서 별 것 아니지만 큰 효과를 보았던 주제가 CPU의 전원관리(Power Management)입니다. 보통 C-State관리라고 하는 부분입니다. Linux의 경우 C-State를 관리하기 위한 다양한 방법들이 아주 잘 정리되어 있습니다. 저도 여러번 소개하였고 최근에 쓴 글은 아래입니다.
Linux를 주로 사용하고 있어서 Windows Server를 사용할 일이 없지만 Linux처럼 C-State를 관리하는 방법이 윈도우에 있는지가 궁금했습니다. 몇 번 검색도 했었지만 관련한 글을 찾지 못했습니다. 있어도 Linux나 Windows에 상관없는 BIOS 설정정도 였습니다.
그런데 몇 일전 아주 재미있는 글을 하나 보았습니다. Windows7에서 CPU가 C1,C2,C3 상태로 빠지지 않도록 하는 라이브러리입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//WIN7 const DWORD DISABLED = 1; const DWORD ENABLED = 0; GUID *scheme; PowerGetActiveScheme(NULL, &scheme); PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED); PowerSetActiveScheme(NULL, scheme); unsigned int ActPwrSch; DWORD currPolicy,newPolicy, curr1Policy,curr2Policy, new1Policy, new2Policy; MACHINE_PROCESSOR_POWER_POLICY Policy; if(GetActivePwrScheme(&ActPwrSch)) { if(ReadProcessorPwrScheme(ActPwrSch,&Policy)) { printf("Read Power Scheme:\n"); //if(Policy.ProcessorPolicyAc.DisableCStates!=0) currPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion; curr1Policy = Policy.ProcessorPolicyAc.Policy[1].AllowPromotion; curr2Policy = Policy.ProcessorPolicyAc.Policy[2].AllowPromotion; Policy.ProcessorPolicyAc.Policy[0].AllowPromotion = 0; Policy.ProcessorPolicyAc.Policy[1].AllowPromotion = 0; Policy.ProcessorPolicyAc.Policy[2].AllowPromotion = 0; newPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion; if(WriteProcessorPwrScheme(ActPwrSch,&Policy)) { printf("WriteProcessorPwrScheme succeed\n"); if(SetActivePwrScheme(ActPwrSch,0,0)) { printf("SetActivePwrScheme succeed!!\n"); } } } |
위의 함수는 Windows7에서는 동작을 하지만 Windows XP에서는 동작을 하지 않는다고 해서 올린 질문에 포함한 코드입니다.
Trying to disable Processor idle states (C states) on Windows PC
2.
Linux나 Windows 모두 Intel과 함께 오랜 작업을 했기때문에 Intel CPU가 제공하는 전원관리기능을 OS에서 구현하지 않을리 없습니다. 다만 무관심이 곧 ‘없음’으로 오해한 저의 무지가 원인일 뿐입니다. 그래서 찬찬히 조사해보았습니다. 마이크로소프트가 제공한 자료중 C-State를 아주 잘 정리한 표가 있습니다.다른 그림보다 무척이나 쉽게 잘 만들었습니다.
우선 개론입니다. 마이크로소프트가 개발한 OS가 제공하는 전원관리에 대한 상세한 정보는 아래에 있습니다.
그리고 OS별 전원관리는 Windows7과 Windows 2008 Server로 나누어 제공하고 있습니다. 먼저 아래는 Windows Server입니다. Windows Server Power Management Implementation Details가 주제입니다.
Windows7은 Windows 7 Power Management Overview을 확인하시길 바랍니다. 이상은 PPT로 만들어진 자료입니다.
PPT가 아닌 White Paper를 원하시면 아래를 참고하세요. 아주 잘 정리되어 있습니다.
Processor Power Management in Windows 7 and Windows Server 2008 R2
앞서 소개한 함수와 같은 것을 개발하고자 하면 앞서 소개한 개론중 Power Management Reference을 보시길 바랍니다.
3.
윈도우에서 Low Latency를 위한 환경설정을 할 때 전원관리외 중요한 부분이 많습니다. 저는 경험이 부족합니다. 필요할 때 관심을 갖는 정도일 뿐입니다. Windows Server로 트레이딩서버를 운용하시는 분을 아래를 읽어보시면 어떨까 합니다.
Performance Tuning Guidelines for Windows Server 2012 Performance Tuning Guidelines for Windows Server 2008 R2 Performance Tuning Guidelines for Windows Server 2008
(*)Windows 2012 Server와 Windows 7을 위한 튜닝가이드입니다.
Performance Tuning Windows 2012: Power Consumption and Performance