커널 버퍼의 백그라운드 플러시

커널 버퍼의 백그라운드 플러시

내 Ubuntu Xenial 시스템은 다음과 같습니다.

# uname -r
4.4.0-179-generic
#

매초마다 파일에 5바이트를 총 5번 쓰는 다음과 같은 간단한 C 코드가 있습니다.

{
    int fd = open("test.txt", O_WRONLY | O_TRUNC);
    if (fd == -1) return -1;
    int x = 0;
    while (x++ < 5)
    {       
        write(fd, "Hello", 5);
        sleep(1);
    }       
}

나는 또한 다음을 가지고 있습니다 :

# cat /proc/sys/vm/dirty_writeback_centisecs
500
#

그러나 내가tail -f test.txt 파일에 즉시 출력이 나타나는 것을 봅니다.: 위 내용을 토대로 5초 후에 나타날 것으로 예상했습니다. 나는 이것에 대해 많은 연구를 했고 그것이 pdflush더 이상 존재하지 않는다는 것을 발견했지만 어떤 프로세스/스레드가 내 커널에서 더티 페이지를 다시 쓰는 일을 담당하는지 알 수 없습니다.

누구든지 이 문제를 해결할 수 있나요? 데이터가 텍스트 파일로 플러시되는 시점을 어떻게 제어합니까?

고쳐 쓰다:

답변을 받은 후다음과 같은, 테스트를 해보니 파일 수정 시간을 봤습니다. LinuxScratch이전에 표시된 코드가 있는 이진 파일의 이름입니다.

파일이 실제로 매초마다 업데이트되는 것을 볼 수 있습니다.

$ ./LinuxScratch &
[1] 1475

$ ls --time-style='+%d-%m-%Y %H:%M:%S' -l
total 104
-rwxrwxr-x 1 ubuntu ubuntu 37576 22-12-2020 19:35:46 LinuxScratch
-rw-rw-r-- 1 ubuntu ubuntu    15 22-12-2020 19:41:47 test.txt

$ ls --time-style='+%d-%m-%Y %H:%M:%S' -l
total 104
-rwxrwxr-x 1 ubuntu ubuntu 37576 22-12-2020 19:35:46 LinuxScratch
-rw-rw-r-- 1 ubuntu ubuntu    20 22-12-2020 19:41:48 test.txt

$ ls --time-style='+%d-%m-%Y %H:%M:%S' -l
total 104
-rwxrwxr-x 1 ubuntu ubuntu 37576 22-12-2020 19:35:46 LinuxScratch
-rw-rw-r-- 1 ubuntu ubuntu    25 22-12-2020 19:41:49 test.txt

$ ls --time-style='+%d-%m-%Y %H:%M:%S' -l
total 104
-rwxrwxr-x 1 ubuntu ubuntu 37576 22-12-2020 19:35:46 LinuxScratch
-rw-rw-r-- 1 ubuntu ubuntu    25 22-12-2020 19:41:49 test.txt
[1]+  Done                    ./LinuxScratch
$

업데이트 2

또한 새로 고침을 담당하는 스레드와 관련하여이 답변쓰기 저장 수행을 담당하는 일반 [kworker/#.##] 커널 스레드로 선언합니다.

업데이트 3

LWN.net에서 기사를 읽은 후답변, 저는 더 많은 연구를 했고 /proc/sys/vm/dirty_expire_centisecs(설명된 바와 같이) 가치를 시도함으로써 그 사실을 발견했습니다.여기) 그런 다음 watch에서 실행하면 /proc/vmstat더티 페이지가 처음에는 증가했다가 새로 고침 시 감소하는 것을 볼 수 있습니다.

$ sudo sysctl -w vm.dirty_expire_centisecs=250
$ watch -d -n 0.1 grep -e dirty /proc/vmstat

다른 쉘에서:

$ ./LinuxScratch

이는 더티 페이지( nr_dirty)가 1씩 증가한 다음 약 2.5초 후에 감소함을 보여줍니다(어느 쪽이든 기본값인 3000(30초)보다 훨씬 빠릅니다).

이것페이지는 매개변수 설명에도 유용합니다.

그래서 다 말했지, 허용된 답변은 원래 질문을 부분적으로 설명하며 여기 업데이트는 이를 시연/제어하는 방법을 보여줍니다. 나는 결국 기능을 확인하고 완전히 이해하기 위해 커널 버퍼를 파일 시스템으로 플러시하는 것을 어떻게든 중지할 수 있기를 원하지만 허용된 답변에서 커널이 항상 가능하지 않을 수 있다고 추측합니다. 모드를 가져오고 캐시에 최신 데이터를 표시합니다.

답변1

명령 은 tail페이지 캐시에서도 입력을 받습니다. 페이지 캐싱의 요점은 프로세스(파일에 쓰는 프로세스뿐만 아니라 모든 프로세스)가 디스크에 액세스하지 않고도 캐시에서 필요한 데이터를 빠르게 찾을 수 있다는 것입니다.

커널 pdflush스레드가 장치별 커널 스레드로 대체되었습니다. 이것LWN.net 기사그 변화의 배경과 동기가 설명되어 있습니다.

관련 정보