Thunderbird에서 수천 개의 이메일을 작업하면 HDD 충돌 소리가 들립니다. 꽤 들리지 않습니다.
이는 대량의 메일로 작업을 수행할 때만 발생합니다(예: 수천 개의 메시지를 휴지통으로 이동). 또한 매우 느립니다.
이 문제를 어떻게 처리합니까?
답변1
Thunderbird 사용량을 빠르게 strace
표시fsync
로컬 데이터베이스를 동기화하기 위해 호출각 이메일 작업 후. 시스템이 모든 쓰기 캐시를 강제로 쓰도록 합니다. 1
그렇게 하면 시스템 충돌(또는 Thunderbird 충돌)로 인한 로컬 데이터베이스 손상 가능성이 크게 줄어들기 때문에 Thunderbird가 더 안정적이게 됩니다. 그러나 이로 인해 사용자의 하드 드라이브가 마모되고 전체 시스템 용량이 최적 수준보다 낮아집니다.
오픈 소스 세계뿐만 아니라 다른 많은 소프트웨어에서도 유사한 동작을 볼 수 있습니다. 예를 들어 ext4는 모든 쓰기 시 쓰기 캐시를 작성합니다.5 초, 자신의 fs를 차선책으로 만듭니다. 또는 PostgreSQL 데이터베이스도 동일한 작업을 수행합니다.각 거래가 제출된 후. 이러한 기능은 두 경우 모두 쉽게 끌 수 있지만 Thunderbird에서는 동일한 기능을 찾을 수 없습니다.
내 연구에 따르면 이 기능을 끌 수 있는 방법이 없으며 단지 이 작은 기능을 위해 Thunderbird를 다시 컴파일하는 것은 분명히 과잉입니다. 대신 간단한 접근 방식모든 fsync
썬더버드 호출 비활성화쉽게 얻을 수 있으며 Thunderbirds는 무슨 일이 일어나고 있는지조차 모릅니다.
동일한 메커니즘은 하드 드라이브에 과부하를 주어 결과가 전혀 없거나 거의 없는 다른 프로세스에도 효과적입니다. 이 해결 방법을 사용하려면 개발 패키지와 함께 C 컴파일러가 필요합니다.
비결은 fsync()
아무 것도 하지 않고 시뮬레이션을 사용하여 Thunderbird가 사용할 수 있는 호출에 연결하는 것입니다.
- 이것을 다음과 같은 작은 .c 파일에 삽입하십시오
nosync.c
.
int fsync(int arg) {
return 0;
}
int fdatasync(int arg) {
return 0;
}
우리는 이 명령을 사용하여 이를 작은 공유 라이브러리로 컴파일합니다
gcc -s -Os -Wall -shared -o nosync.so nosync.c
.그런 다음 Thunderbird는 다음 명령으로 호출되어야 합니다.
LD_PRELOAD=/path/to/nosync.so thunderbird
우와! 더 이상 하드 드라이브를 죽이지 마세요.
물론 이는 Firefox 내부 데이터베이스의 추가 보호를 제거합니다. 이는 로컬 계정에 중요한 데이터가 있는 경우에만 특히 위험할 수 있습니다. 그러나 요즘 Firefox는 일반적으로 모든 것을 IMAP 계정에 저장하며 로컬 데이터베이스는 기본적으로 캐시일 뿐입니다. 따라서 fsync
이 정규화는 필요하지 않습니다.
1 Thunderbird는 다중 스레드 프로세스이므로 strace
모든 스레드를 처리하려면 작은 스크립트가 필요합니다(strace는 하나의 pid만 추적할 수 있습니다).