Open MinJunKweon opened 1 year ago
클록 속도
를 높이는데 쓰였다메모리
성능은 그만큼 빠르게 성장하지 못하여 점점 성능차가 발생했다CPU 캐시
가 고안되어 프로세서 <-> 메모리 사이에서 중재 역할을 해주었다캐시 일관성 프로토콜
을 고안하게 됨MESI 프로토콜
(Modified, Exclusive, Shared, Invalid)오.. 어플리케이션단 캐싱 기법들 공부하다가 들은 단어들이 여기서 먼저 시작된 것 같군
페이지 테이블
의 캐시 역할실제 실행시간보다 기네 ㄷㄷ;
vmstat
-w
(wide) 옵션 붙이면 그나마 덜 깨짐
swap 섹션은 일단 0을 넘으면 메모리가 부족하다는 뜻이므로 확인해줘야할 듯
토이 플젝에서 EC2 free tier로 실행할 때 일부러 swap 메모리 사용하긴 했었는데.. 실사용하는 예시는 거의 없을 듯. 너무 느려서
iostat
2023-03-05T04:16:59.173+0900: 114143.907: [GC pause (G1 Evacuation Pause) (young), 0.1123883 secs]
[Parallel Time: 94.8 ms, GC Workers: 4]
[GC Worker Start (ms): Min: 114143912.3, Avg: 114143912.3, Max: 114143912.4, Diff: 0.0]
[Ext Root Scanning (ms): Min: 7.3, Avg: 7.5, Max: 7.8, Diff: 0.5, Sum: 30.0]
[Update RS (ms): Min: 17.8, Avg: 18.1, Max: 18.3, Diff: 0.5, Sum: 72.3]
[Processed Buffers: Min: 780, Avg: 932.2, Max: 1068, Diff: 288, Sum: 3729]
[Scan RS (ms): Min: 27.6, Avg: 27.8, Max: 28.1, Diff: 0.5, Sum: 111.3]
[Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Object Copy (ms): Min: 41.0, Avg: 41.2, Max: 41.3, Diff: 0.4, Sum: 164.8]
[Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]
[Termination Attempts: Min: 1, Avg: 24.5, Max: 37, Diff: 36, Sum: 98]
[GC Worker Other (ms): Min: 0.1, Avg: 0.1, Max: 0.2, Diff: 0.1, Sum: 0.5]
[GC Worker Total (ms): Min: 94.7, Avg: 94.7, Max: 94.8, Diff: 0.1, Sum: 378.9]
[GC Worker End (ms): Min: 114144007.1, Avg: 114144007.1, Max: 114144007.1, Diff: 0.0]
[Code Root Fixup: 0.0 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.5 ms]
[Other: 17.0 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 6.5 ms]
[Ref Enq: 0.9 ms]
[Redirty Cards: 0.3 ms]
[Humongous Register: 0.1 ms]
[Humongous Reclaim: 0.0 ms]
[Free CSet: 1.6 ms]
[Eden: 3264.0M(3264.0M)->0.0B(4472.0M) Survivors: 24576.0K->24576.0K Heap: 5550.6M(8192.0M)->2286.8M(8192.0M)]
[Times: user=0.42 sys=0.00, real=0.12 secs]
추측 실행은 불명예스럽게도 2018년 초반 아주 많은 CPU에 영향을 끼친 주요 보안 문제의 근원입니다
?명령어와 다른 캐시를 어쩔 수 없이 강제로 비워야 합니다
sbrk()
if (a > 16)
b = 32
raise_exception();
// the line below is never reached
access(probe_array[data * 4096]);
raise_exception() 함수가 실행됩니다.
순차적 실행에서는 3번 줄이 실행되지 않지만, 비순차적 실행으로 인하여 3번째 줄이 실행되게 됩니다.
raise_exception() 함수에 의해 예외가 발생하고 제어 흐름이 운영체제의 예외 처리기로 점프합니다.
예외로 인해서 순서에 맞지 않게 실행된 명령은 폐기되지 않습니다.
이 예외가 메모리 액세스 또는 다른 CPU 예외로 인해 발생했는지 여부에 관계없이 제어 흐름은 다음 사용자 공간 명령이 아닌 커널에서 계속됩니다.
커널에서 실행이 되게 되고 캐시에 데이터가 올라가게 됩니다.
무어의 법칙: 대량 생산한 칩상의 트랜지스터 수는 약 18개월마다 2배씩 증가한다.
→ 컴퓨터 파워가 기하급수적으로 증가. Application 개발자, 자바는 만은 혜택을 받았다. 하지만, 성능을 진지하게 고민하는 프로그래머라면, 가용 리소스를 최대한 활용할 수 있도록 자바 플랫폼의 원리와 기술을 잘 알아야 한다.
무어의 법칙에 따라 급증한 트랜지스터는 처음엔 클록 속도를 높이는데 쓰였다(클록 속도가 증가하면 초당 더 많은 명령어를 처리할 수 있기 때문)
캐시 Write 방식
가상 메모리 주소를 물리 메모리 주소로 매핑하는 페이지 테이블의 캐시 역할을 수행
공격자는 희생자 프로세스에서 분기 명령을 수행할 때 분기할 목적지를 잘못 예측하게 유도하고 잘못 예측된 데이터가 Speculative execution에 의해 캐시에 적재되면 Flush + Reload 공격을 이용하여 데이터를 유출한다.
Flush + Reload 공격: Flush + Reload 공격을 위해 공격자는 LLC(Last Level Cache)를 모든 코어에서 공유하고 있다는 점을 이용한다. LLC는 모든 코어에서 공유하고 있기 때문에 캐시의 일관성을 유지하기 위해 LLC에서 데이터가 제거되면 다른 모든 코어에서도 데이터가 제거된다.이러한 특성을 악용하여 공격자는 LLC의 모든 Cache Line을 clflush() 명령을 이용하여 제거한다. 이 상태에서 희생자가 어떤 메모리에 접근하면 희생자가 접근한 메모리 주소만 유일하게 캐시에 적재된다. 공격자는 일반적인 방법으로는 캐시에 적재된 데이터를 유출할 수 없기 때문에 메모리 접근 속도를 이용한다. 공격자는 데이터를 유출하기 위해 희생자가 접근한 메모리 주소에 접근한다. 공격자가 접근한 메모리 주소가 희생자가 접근했던 메모리 주소라면 캐시에 적재되어 있기 때문에 접근 속도가 매우 빠르지만, 희생자가 접근하지 않았던 메모리 주소라면 접근 속도가 전자보다 상대적으로 느리다. 공격자는 유출하려는 데이터를 메모리 주소의 index로 이용하여 유출하려는 데이터가 캐시에 적재되도록 만든 후 메모리 주소의 index에 다시 접근하여 데이터를 유출한다
• https://koreascience.kr/article/JAKO202013661038812.pdf
Coherency controller(Snooper)가 Cache 일관성을 유지하기 위해 Bus transaction을 monitoring 하는 체계.
→ 대부분의 ARM processor들은 MOESI를 사용한다고 한다.
느낀점
정리
MESI 프로토콜
캐시 기록 방식
변환 색인 버퍼(TLB)
Virtual Memory 주소를 실제 Physical Memory 주소로 변환하기 위해 사용되는 룩업 테이블 캐시
운영체제
애플리케이션이 제대로 동작하는지 확인하는 전략
vmstat
,iostat
등)I/O 성능을 향상시키는 방법 - 커널 바이패스
더 알아본 것