Skip to content

Fix: 큰 게임은 예열을 끝까지 읽어도 가장 중요한 앞부분이 밀려나 재예열이 되풀이됨 - #188

Merged
DO0OG merged 1 commit into
mainfrom
187-fix-stream-requeues-as-it-reads
Nov 13, 2026
Merged

DO0OG merged 1 commit into
mainfrom
187-fix-stream-requeues-as-it-reads

Conversation

@DO0OG

@DO0OG DO0OG commented Nov 13, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • 예열 스트림이 묶음을 읽을 때마다 그 범위를 곧바로 다시 만집니다. 예열 읽기는 이미 캐시에 있는 페이지의 순서를 바꾸지 않으므로, 지금까지는 빠진 부분만 채우는 재예열이 그 게임의 나머지 페이지를 오래된 순서로 남겼습니다. 이제 한 번의 스트림이 끝나면 그 게임의 모든 페이지가 이번 스트림 동안에 다시 들어간 것이 됩니다 (csharp/src/AsterCache.Service/StreamRequeue.cs, Prewarm.Run.cs, Streaming.cs).
  • 보충의 이어 읽기는 꼬리를 읽기 전에 건너뛴 앞부분과 공통 블록을 한 번 만집니다 (Prewarm.Solar.cs, Prewarm.Supplement.cs).
  • 만지기가 디스크 읽기를 만나 멈추면 그 스트림의 남은 묶음은 만지지 않고, 스트림 자체는 계속합니다. 만지기의 실패·취소는 스트림의 결과(읽은 양, 성공 여부)를 바꾸지 않습니다.
  • 완료 줄에 requeued N MiB in S s 를 붙이고, 멈췄으면 requeue stopped by disk reads 를 한 번 붙입니다. 만진 시간은 양보 시간과 외부 부하 관측의 노출 시간에서 뺍니다 (PrewarmYield.cs).
  • 사다리와 새로 고침이 빠진 부분을 만나 멈출 때 after T of N MiB 로 어디까지 만졌는지를 남깁니다 (Solar.cs).
  • docs/SOLAR.md, docs/SOLAR.ko.md 를 바뀐 동작과 로그 문구에 맞췄습니다.

알아 둘 점

  • memory.standby_ladder 가 꺼져 있거나 서비스 권한이 없으면 스트림은 이전과 같습니다.
  • 스트림이 읽는 양·순서·취소 지점, 메모리 예비량과 캐시 예산, 안티치트 게이트는 바뀌지 않았습니다. 만지기는 스트림과 같은 디스크 대여·취소 토큰 아래에서 돌고, 메모리를 고정하거나 잠그지 않습니다.
  • 비용은 캐시에 있는 1 GiB 에 약 0.5초(같은 PC 에서 잰 값)입니다. 설치본에서의 효과(큰 게임의 사다리 완료, 재예열 되풀이 소멸)는 아직 확인하지 않았습니다.
  • 이어 읽기의 앞부분 만지기는 첫 묶음 점검보다 먼저 돌아, 그 짧은 구간에는 트리거 대기 선점과 외부 부하 관측이 적용되지 않습니다(게임 시작·선점 표시와 같은 디스크의 게임 실행은 확인합니다).

Test plan

  • dotnet build csharp -c Release -m:1 경고 0, 오류 0
  • dotnet test csharp/tests/AsterCache.Tests -c Release --no-build --filter "Category!=Live" 4,450건 통과
  • dotnet format csharp --verify-no-changes 종료 코드 0
  • git diff --check 종료 코드 0
  • CI build-test 통과: https://github.com/DO0OG/AsterCache/actions/runs/43514558230

Closes #187

예열 읽기는 이미 캐시에 있는 페이지의 순서를 바꾸지 않아, 빠진 부분만 디스크에서
읽는 재예열은 그 게임의 나머지 페이지를 이전 예열 때의 오래된 순서로 남겼습니다.
목록이 큰 게임은 빠진 부분을 채우는 동안 가장 먼저 읽은 앞부분이 다시 밀려나,
사다리가 끝까지 가지 못하고 약 20분마다 수 GiB 를 다시 읽었습니다.

- 예열 스트림이 묶음을 읽을 때마다 그 범위를 곧바로 다시 만져 대기 목록의 뒤로 보냄
- 보충의 이어 읽기는 꼬리를 읽기 전에 건너뛴 앞부분과 공통 블록을 한 번 만짐
- 만지기가 디스크 읽기를 만나면 그 스트림의 남은 묶음은 만지지 않고 스트림은 계속함
- 완료 줄에 만진 양과 시간을 `requeued N MiB in S s` 로 남기고, 만진 시간은 양보·노출 시간에서 뺌
- 사다리가 빠진 부분을 만나 멈출 때 어디까지 만졌는지를 `after T of N MiB` 로 남김
- `memory.standby_ladder` 가 꺼져 있으면 스트림은 이전과 같음
- `docs/SOLAR.md`, `docs/SOLAR.ko.md` 를 바뀐 동작과 로그 문구에 맞춤

Issues #187
@DO0OG
DO0OG merged commit 7dc93d8 into main Nov 13, 2026
1 check passed
@DO0OG
DO0OG deleted the 187-fix-stream-requeues-as-it-reads branch November 13, 2026 21:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix: 큰 게임은 예열을 끝까지 읽어도 가장 중요한 앞부분이 밀려나 재예열이 되풀이됨

1 participant