Thunderbird가 대규모 작업 중에 하드 드라이브에 과부하를 걸면 어떻게 해야 합니까?

Thunderbird가 대규모 작업 중에 하드 드라이브에 과부하를 걸면 어떻게 해야 합니까?

Thunderbird에서 수천 개의 이메일을 작업하면 HDD 충돌 소리가 들립니다. 꽤 들리지 않습니다.

이는 대량의 메일로 작업을 수행할 때만 발생합니다(예: 수천 개의 메시지를 휴지통으로 이동). 또한 매우 느립니다.

이 문제를 어떻게 처리합니까?

답변1

Thunderbird 사용량을 빠르게 strace표시fsync로컬 데이터베이스를 동기화하기 위해 호출각 이메일 작업 후. 시스템이 모든 쓰기 캐시를 강제로 쓰도록 합니다. 1

그렇게 하면 시스템 충돌(또는 Thunderbird 충돌)로 인한 로컬 데이터베이스 손상 가능성이 크게 줄어들기 때문에 Thunderbird가 더 안정적이게 됩니다. 그러나 이로 인해 사용자의 하드 드라이브가 마모되고 전체 시스템 용량이 최적 수준보다 낮아집니다.

오픈 소스 세계뿐만 아니라 다른 많은 소프트웨어에서도 유사한 동작을 볼 수 있습니다. 예를 들어 ext4는 모든 쓰기 시 쓰기 캐시를 작성합니다.5 초, 자신의 fs를 차선책으로 만듭니다. 또는 PostgreSQL 데이터베이스도 동일한 작업을 수행합니다.각 거래가 제출된 후. 이러한 기능은 두 경우 모두 쉽게 끌 수 있지만 Thunderbird에서는 동일한 기능을 찾을 수 없습니다.

내 연구에 따르면 이 기능을 끌 수 있는 방법이 없으며 단지 이 작은 기능을 위해 Thunderbird를 다시 컴파일하는 것은 분명히 과잉입니다. 대신 간단한 접근 방식모든 fsync썬더버드 호출 비활성화쉽게 얻을 수 있으며 Thunderbirds는 무슨 일이 일어나고 있는지조차 모릅니다.

동일한 메커니즘은 하드 드라이브에 과부하를 주어 결과가 전혀 없거나 거의 없는 다른 프로세스에도 효과적입니다. 이 해결 방법을 사용하려면 개발 패키지와 함께 C 컴파일러가 필요합니다.

비결은 fsync()아무 것도 하지 않고 시뮬레이션을 사용하여 Thunderbird가 사용할 수 있는 호출에 연결하는 것입니다.

  1. 이것을 다음과 같은 작은 .c 파일에 삽입하십시오 nosync.c.
int fsync(int arg) {
  return 0;
}

int fdatasync(int arg) {
  return 0;
}
  1. 우리는 이 명령을 사용하여 이를 작은 공유 라이브러리로 컴파일합니다 gcc -s -Os -Wall -shared -o nosync.so nosync.c.

  2. 그런 다음 Thunderbird는 다음 명령으로 호출되어야 합니다.LD_PRELOAD=/path/to/nosync.so thunderbird

우와! 더 이상 하드 드라이브를 죽이지 마세요.

물론 이는 Firefox 내부 데이터베이스의 추가 보호를 제거합니다. 이는 로컬 계정에 중요한 데이터가 있는 경우에만 특히 위험할 수 있습니다. 그러나 요즘 Firefox는 일반적으로 모든 것을 IMAP 계정에 저장하며 로컬 데이터베이스는 기본적으로 캐시일 뿐입니다. 따라서 fsync이 정규화는 필요하지 않습니다.

1 Thunderbird는 다중 스레드 프로세스이므로 strace모든 스레드를 처리하려면 작은 스크립트가 필요합니다(strace는 하나의 pid만 추적할 수 있습니다).

관련 정보