큰 청크로 디스크에 플러시를 제어하기 위한 파일 생성

큰 청크로 디스크에 플러시를 제어하기 위한 파일 생성

Linux에는 디스크에 매우 느리게(때로는 1kb/s보다 느린 경우도 있음) 쓰는 프로세스(ffmpeg)가 있습니다. FFmpeg는 자주 작성되지 않는 256kb 청크까지 버퍼링할 수 있지만 ffmpeg는 가끔씩 중단되며, 파일이 업데이트되고 있는지 확인하여 이러한 중단을 감지하려고 하면 업데이트 사이에 최대 10~15분까지 오랜 시간 기다려야 합니다. 그렇지 않으면 ffmpeg 프로세스가 쓰기를 멈춘 것처럼 보이지만 실제로는 여전히 내부 버퍼를 채우고 있을 때 실수로 ffmpeg 프로세스를 종료할 수 있습니다.

strace(어쨌든 찾을 수 있음)를 사용하지 않는 한 이를 감지할 방법이 없는 것 같습니다. 그래서 ffmpeg에서 버퍼링을 끄고 ffmpeg에서 버퍼링되지 않은 디스크에 쓰는 방법을 알고 싶습니다.

이로 인해 디스크가 지속적으로 작은 쓰기 작업을 수행하고 전력을 낭비하게 됩니다(SSD를 사용하면 마모 레벨링이 엉망이 될 수도 있음).

그래서 ffmpeg가 새로 고침 특성을 지정할 수 있는 "가상 파일"(메모리 - 커널 메모리 또는 프로세스)에 쓰기를 원합니다. 2분마다 새로 고침을 지정하면 파일 크기를 계속해서 기록하고 있는지 확인할 수 있습니다.

나는 이 작업을 수행하는 다른 방법을 놓치고 있다고 생각하지 않습니다. ffpmeg로 들어오는 소켓 스트림을 관찰할 수 있더라도 프로세스 자체는 여전히 쓰기를 중지하고 데이터를 잃을 수 있습니다. ffmpeg 외부에서 버퍼링하는 것이 가장 좋은 방법인 것 같습니다.

Linux에는 이를 수행하는 기본 제공 방법이 있습니까, 아니면 이것이 사용자 정의 프로세스를 의미합니까? 나는 작은 C 프로그램으로 이 작업을 수행하고 데이터를 파이프하는 방법을 알고 있다고 생각하지만 더 깔끔한 방법이 있는지 궁금합니다.

답변1

이를 달성하기 위해 GNU를 사용할 수 있습니다 dd. GNU는 테이프 드라이브를 읽고 쓸 때 데이터를 최적으로 다시 차단하도록 설계되었습니다. 예를 들어 버퍼링되지 않은 출력을 다음으로 파이프합니다.

dd obs=20k status=progress >/the/file

20k디스크에 쓸 때마다 사용하려는 출력 블록 크기는 어디에 있습니까? k킬로바이트를 나타냅니다. stderr에서 한 줄을 얻으면 status=progress쓰기가 완료되면 업데이트됩니다.

20480 bytes (20 kB, 20 KiB) copied, 12 s, 1.7 kB/s

원하는 경우 이 옵션을 무시하고 dd진행 상황을 기록하려는 경우 SIGUSR1 신호로 종료할 수 있습니다.

관련 정보