
Linux의 고성능 설정(많은 동시 업데이트)에서 이는 디스크의 30k 파일을 업데이트하는 가장 효과적인 방법입니다.
1. 해당 파일을 간단히 업데이트합니다.
2. 이전 파일을 삭제하고 새 파일을 저장합니다.
나는 주로 디스크 액세스 시간에 대해 우려하고 있지만 프로세서 로드도 여기서 요인이 될 수 있습니다.
답변1
사용 중인 디스크 하위 시스템과 파일 시스템은 여기서 큰 영향을 미칩니다. 실제로 벤치마킹해야 할 만큼 다양한 결과가 나올 수 있습니다. 하지만 :
- 실제 동기식 IO는 SATA 드라이브의 경우 약 100 IOPS, SAS 드라이브의 경우 약 200 IOPS로 제한되며 SSD의 경우 10 IOPS에서 10000까지 매우 다양합니다. IOPS 수에 데이터 드라이브 수를 곱합니다.
- 최신 파일 시스템은 쓰기 작업을 함께 클러스터링합니다. 적절한 파일 시스템 선택과 세부 조정으로 인해 결과가 10~100배 정도 변경됩니다.
- 최신 스토리지 컨트롤러는 쓰기를 캐시할 수 있습니다. 적절한 후기입 캐시 설정은 다시 한번 결과를 10~1000배로 변경합니다.
따라서 적절한 하드웨어(WB 캐시, SSD가 포함된 실제 RAID 컨트롤러), 적절한 소프트웨어(최신 파일 시스템, ext3은 여기서 전혀 문제가 되지 않습니다. xfs를 사용하겠지만 ext4는 옵션임) 및 적절한 튜닝(다양한 커널 IO 스케줄러 테스트) , IO 크기 등 설정)은 엄청난 영향을 미칩니다.
답변2
많이 업데이트하는 경우 파일 내용이 오래되어도 문제가 되지 않을 것입니다. 그렇다면 tmpfs에 붙이고 업데이트 시 파일을 잘라서 다시 작성하세요. 디스크를 전혀 사용할 가능성이 없으므로 가장 저렴한 방법이 될 것입니다.
다음으로 가장 가까운 것은정시마운트 옵션이 설정되고 저널링이 꺼졌습니다. 그러나 충돌이 발생하면 데이터가 손실될 수 있으므로 위험합니다.
그 후 저널링이 켜지면 다시 시간이 나지 않습니다.
Linux는 지정된 간격으로 쓰기를 버퍼링하고 디스크에 동기화하므로 일반적으로 I/O 관점에서 쓰기의 영향을 '느끼지' 않습니다(쓰기가 매우 무겁지만 조정이 가능한 경우는 제외). 디스크에 동기화하기 전에 오랫동안 쓰기 버퍼를 채울 수 있도록 조건을 디스크에 동기화하도록 변경할 수도 있습니다.
정말 영리한 작업을 수행한 후.. fallocate를 사용하여 가능한 최대 값이 될 파일 공간을 미리 할당합니다. 그런 다음 mmap은 파일을 열어 메모리로 직접 읽습니다. 그러면 다시 쓰기가 거의 즉각적으로 이루어집니다(그러나 전력 손실이 있으면 손실이 발생합니다). 그런 다음 msync 호출을 사용하여 디스크로 다시 플러시할 시기를 제어할 수 있습니다.
답변3
데이터베이스 파일이 아닌 FLAT 파일을 사용한다고 가정하면 두 방법 모두 실제로 다음과 같은 장단점이 있습니다.
단순히 파일의 내용을 그 자리에서 덮어쓰면 재할당 단계가 확실히 방지됩니다. 그러면 거기에서 약간의 시간을 절약할 수 있습니다. 그러나 조각의 배치가 최적이 아닐 수도 있습니다.
디스크 조각화에 따라 더 최적의 데이터 배치를 얻을 수 있습니다. 그러나 공간을 할당해야 하기 때문에 속도가 조금 더 느려질 것이며, 보다 안전한 설정에서 실행하는 경우 할당 전에 블록을 0으로 만드는 데 시간이 필요할 것입니다.