개발 중인 일부 소프트웨어를 실행하면 Mac이 16시간마다 패닉 재부팅을 일으키고 tcsh 스크립트를 실행할 때 항상 "os_refcnt" 커널 변수가 오버플로되는 이유를 알아내려고 합니다. 테스트 사례에서는 중단된 부분부터 다시 시작하고 코드를 다시 실행하면 올바른 결과를 얻을 수 있습니다. 처음에는 이것이 쉘 변수에 대한 참조라고 생각했지만 스크립트를 사용한 후 몇 가지 다른 방법으로 모든 변수를 설정 해제해도 아무런 효과가 없었습니다.
가장 큰 질문은 "os_refcnt"가 계산하는 "참조"가 어떤 유형의 이벤트입니까?
카운트 값이 오버플로되는 이유는 무엇입니까? 왜 재설정하지 않습니까? 동시 스레드가 많아 메모리가 재설정되는 것을 방지하는 "경쟁 조건"으로 인해 "참조" 수의 오버플로가 발생합니까? (이 프로그램은 12개의 독립적인 분기에서 서로 다른 데이터에 대해 동시에 실행되며, 이는 사용할 수 있는 최대치이며 실행 시간은 더 짧아집니다.)
Mac 기술 지원에서는 좋은 조언을 제공하지 않았습니다.
UNIX와 유사한 시스템 호출 외에도 스크립트는 해당되는 경우 GNU 프로젝트의 컴파일러로 컴파일된 프로그램을 사용합니다. CPU 시간 측면에서 주 프로그램은 스크립트로 작성되고 컴파일됩니다. 이 프로그램은 다른 프로그램에서 계산한 상수 데이터의 큰 배열을 스크립트에 저장합니다. 4개의 입력 값은 배열의 2개 요소의 인덱스를 지정하는 4개의 정수이며, 프로그램은 이 2개 요소의 값을 곱합니다.
"긴급 보고 창"의 오류는 "os_refcnt"(커널에서 사용하는 정수 값 시스템 변수) 오버플로와 관련이 있고 커널이 무엇을 하는지 전혀 몰랐기 때문에 구글 검색을 해서 알아낸 내용은 다음과 같습니다. 커널이 하는 일 중 하나는 CPU 온도를 제어하기 위해 작업 속도를 늦추는 것입니다. 이상해 보여 온도를 확인하기 위해 CPU 온도 표시 앱을 다운로드했는데 CPU 온도가 상당히 높아서 84°C에서 86°C 사이를 맴돌다가 충돌이 발생했습니다. 원통형 MacPro "스택"에 외부 팬을 추가로 설치하여 대부분의 경우 최대 지속 온도를 82~84°C로 유지할 수 있었습니다. 16시간에는 2개의 작업이 동기화되었으므로 작업 내 세그먼트 간에 CPU 가동 중지 시간이 거의 없었고 CPU도 약간 더 따뜻해질 수 있었습니다. 하지만 외부 팬을 사용하면 조금 더 시원한 온도에서도 16.5시간 후에 컴퓨터가 죽는 것으로 나타났는데, 이는 16시간과 크게 다르지 않은 것으로 보입니다. 냉각이 문제인 경우 CPU 냉각을 시도하고 도움이 되는지 확인하기 위해 의도적으로 지연을 추가할 수도 있습니다.
나는 성공하지 못한 채 os_refcount 인터넷 검색을 시도했습니다. 참조 카운트 오버플로로 인해 패닉 재시작이 발생할 수 있는 이유에 대해 다른 많은 추측을 했습니다. 메인 스크립트에서 호출되는 모든 2차 및 3차 스크립트가 "source" 명령 대신 "tcsh" 명령을 사용하여 구현되도록 스크립트를 설정하여 2차 스크립트 종료 시 변수 값이 "잊혀지도록" 했습니다. , 나는 또한 내가 사용하는 모든 쉘 변수에 명시적으로 "unset"을 추가합니다.
커널 변수 "os_refcnt"가 계속해서 오버플로되는 원인이 무엇인지 아는 사람이 있습니까? (제가 사용하고 있는 스크립트를 tcsh에서 bash로 번역하여 상황이 개선될지 알아보려고 생각 중이었지만, 그것도 약간 무리한 것처럼 보였고 필요한 디버깅을 모두 수행하기 전에 합리적인 시도였는지 확인하고 싶었습니다.) 현재는 필요한 결과를 얻으려면 16시간마다 컴퓨터를 다시 시작하기만 하면 됩니다.
문제는 한동안 있었습니다. 현재 MacOS10.15.4 Catalina에서 실행 중입니다. 동일한 프로그램은 이전 Mac에서처럼 자주 OS를 충돌시키지 않지만 ~10^8 "egrep -c" 명령에서 1이 NaN(오류 값)을 반환하도록 합니다. 이러한 NaN 값은 실행 중인 스크립트에서 포착될 수 있으며 egreps가 즉시 다시 실행되면 올바른 숫자를 제공합니다. 그러나 구형 Mac은 대략 5~20배 정도 느립니다. 또한 원통형이 아닌 보다 일반적인 직사각형 상자 모양의 굴뚝을 갖고 있으며 윙윙거리는 소리가 나는 팬이 있습니다. 구형 Mac은 약 1~2주 후에 충돌이 발생했습니다. 아마도 동일한 수의 프로그램 주기 후에 작동이 중단되었기 때문에 동일한 문제가 계속해서 발생하는 것일 수도 있습니다. (충돌을 피하기 위해 "egrep" 대신 "awk"에 해당하는 버전을 사용하여 다른 버전을 시도했습니다. "awk" 또는 "egrep"에서도 동일한 충돌이 발생하지만 흥미롭게도 일부 OS 버전에서는 "awk" 버전이 훨씬 빠릅니다. 다른 버전에서는 "egrep"이 훨씬 빠릅니다. 런타임 차이는 2~3배입니다. 이전 OS 외에 다른 유형의 Mac 하드웨어를 사용하는 경우입니다.)
Apple 지원팀에 도움을 요청했을 때 "귀하의 프로그램(예: 타사 소프트웨어)으로 인해 충돌이 발생했습니다"라는 응답을 받았지만 "귀하의 프로그램을 실행하지 마십시오" 상황이 발생하는 것 외에는 이를 방지하기 위해 할 수 있는 일이 거의 없었습니다.