연결 문제 해결 · Clash 기술 블로그

Mihomo macOS TUN: ENOTSOCK·CPU 급증

macOS Mixed TUN에서 로그가 반복되고 CPU 사용률이 높으며 ENOTSOCK이 표시되나요? 실제 코어와 v1.19.32의 수정 사항을 확인하세요. 백업과 업그레이드 후 권한을 다시 부여하고 오류 반복과 연결을 점검하며, 실패하면 설정을 복원하세요.

  • macOS
  • Mixed TUN
  • ENOTSOCK
  • Mihomo
  • v1.19.32
이 글의 목차

Mac에서 TUN 프록시를 켠 뒤 Mihomo의 CPU 사용량이 줄지 않고 로그에 오류가 계속 반복된다면 어디부터 확인해야 할까요? Mixed TUN의 오류 특징과 실제 코어 버전부터 살펴볼 수 있습니다. 조치가 효과가 있었는지는 로그, CPU 사용량과 실제 연결 결과를 함께 보고 판단해야 합니다.

Mixed TUN 패킷 읽기 오류 루프에 해당하는 증상

macOS의 Mixed TUN 로그에서 socket operation on non-socket이 계속 반복되는지, Mihomo가 CPU를 계속 사용하는지 확인하세요. 한 번의 시작 오류, 정상적인 트래픽 부하 또는 화면의 메모리 사용량 증가만으로는 이 패킷 읽기 오류 루프라고 판단할 수 없습니다.

Issue #3310은 Apple Silicon에서 Clash Party 2.0.3, Mihomo v1.19.31, mixed 스택을 사용하다 발생한 오류를 기록한 보고입니다. 확실한 발생 조건이 없고, 잠자기에서 깨어나기, 네트워크 전환, 설정 다시 불러오기가 관련되는지도 확인되지 않았습니다. 이를 근거로 모든 Mac이나 TUN의 높은 CPU 사용률이 같은 문제라고 단정하지 마세요.

비교할 오류 메시지입니다. 실행할 명령이 아닙니다
batch read packet: socket operation on non-socket

v1.19.32는 반복되는 패킷 읽기 오류 루프를 어떻게 끝내나요?

이번에 확인할 대상은 클라이언트 버전만이 아니라 Mihomo 코어입니다. Clash Party 코어 카드의 실제 버전과 채널, TUN 스위치와 stack 값을 기록하고 구독, 로컬 프로필, 덮어쓰기, 앱 설정을 별도로 백업하세요. 클라이언트를 업데이트해도 이전 코어가 실행 중이면 이 수정은 적용되지 않습니다.

v1.19.32는 macOS의 패킷 읽기 오류 처리 방식을 바꿉니다. ENOTSOCK와 EBADF를 종료 상태로 처리해 Mixed TUN의 읽기를 끝내고 같은 오류가 반복 출력되는 것을 막습니다. 수정 대상은 오류 루프입니다. 연결이 처음 실패한 원인과 실제 통신 복구 여부는 각각 확인해야 합니다.

버전과 오류별 처리 방법

현재 상태먼저 할 일
v1.19.31을 실행 중이며 Mixed TUN에서 같은 패킷 읽기 오류가 계속 반복됨근거와 별도 백업을 보관하고 수정 사항이 포함된 v1.19.32로 업데이트한 뒤 권한을 다시 부여하고 확인하세요.
이미 v1.19.32를 실행 중인데 오류가 계속되거나 다시 발생함먼저 TUN을 끄고 새 버전의 짧은 로그와 현재 설정을 저장하세요. 수정 사항이 있다고 해서 같은 이름의 오류가 모두 해결됐다고 볼 수는 없습니다.
해당 패킷 읽기 오류 없이 화면 메모리, 다운로드 또는 일반 네트워크 문제만 발생함실제로 발생한 메모리, 다운로드 또는 연결 문제를 확인하세요. CPU 사용률이 높다는 이유만으로 프로토콜 스택을 바꾸거나 구성을 초기화하지 마세요.
의존성 버전과 소스 근거
Mihomo v1.19.31에서는 sing-tun v0.4.24를 사용하고 v1.19.32의 go.mod는 v0.4.27을 사용합니다. 해당 수정 커밋은 ENOTSOCK와 EBADF를 os.ErrClosed로 분류합니다. 이 정보로 의존성 버전과 오류 처리 구현을 확인할 수 있습니다.
공식 기록과 기기 검증
#3310 답변에서 v1.19.32를 연결한 뒤 보고자가 issue를 닫았습니다. 다만 당시에는 업데이트 후 시험할 예정이라고만 했으며 기기의 업데이트 후 결과는 공개하지 않았습니다. 근거는 공식 자료와 해당 버전 소스 코드이며 실제 기기에서 별도로 재현하거나 업그레이드로 복구되는지 검증한 결과는 없습니다.

Clash Party 코어 업데이트 후에는 TUN 권한도 다시 부여하세요

시간이 표시된 오류 몇 개와 실제 코어 버전, CPU 관찰 결과를 저장한 뒤 TUN을 끄고 반복 오류가 멈추는지 확인하세요. 임시로 인터넷에 연결해야 할 때는 원래 설정이 시스템 프록시를 지원하는 경우에만 시스템 프록시를 사용하세요. 해당 프록시를 따르는 앱만 처리하며 기기 전체를 계속 처리한다는 뜻은 아닙니다. 전체 로그를 모으려고 오류가 계속 쌓이게 두지 마세요.

아래 메뉴는 Clash Party v2.0.3의 특정 버전 소스 코드와 중국어 화면 표시를 대조한 것입니다. 다른 클라이언트에서는 해당 프로젝트의 공식 코어 업데이트 방법을 따르세요. 메뉴 이름을 그대로 적용하지 마세요. 먼저 백업을 읽을 수 있고 현재 설정을 사용할 수 있는지 확인한 뒤 잠시 인터넷 연결이 끊겨도 괜찮은 시간에 진행하세요.

이 절은 일반 Mihomo 설정을 대상으로 합니다. 현재 Smart 또는 다른 코어 분기를 사용하고 그 분기의 기능에 의존한다면 먼저 해당 유지 관리자의 호환성 안내를 확인하세요. 일반 코어의 특정 버전으로 바로 바꾸지 마세요. 코어가 서로 다르면 버전 숫자가 더 높다는 이유만으로 교체해서는 안 됩니다.

실제로 실행 중인 코어 업데이트

  1. 코어 설정을 열고 기존 값을 기록하세요

    코어 카드에서 코어 설정을 열어 현재 채널과 정확한 버전을 기록하세요. 안정판, 미리보기판, Smart, 특정 버전은 서로 다른 선택입니다. 앱 설정의 Clash Party 버전도 코어 버전과 다릅니다.

  2. 공식 특정 버전 v1.19.32를 선택하세요

    코어 설정에서 특정 버전 선택을 눌러 v1.19.32를 선택하고 설치를 완료하세요. 이 메뉴는 프로젝트의 특정 버전 배포 출처를 사용합니다. 출처와 결과를 확인하고, 이번 수정을 적용하려고 미리 보기판이나 Smart로 바꾸거나 출처를 알 수 없는 코어 파일을 가져오지 마세요.

  3. 가상 네트워크 어댑터 코어의 권한을 수동으로 다시 부여하세요

    macOS에서는 코어를 교체하면 기존 권한이 사라질 수 있습니다. 가상 네트워크 어댑터 페이지에서 코어 권한 수동 부여를 누르고 실제 시스템 안내에 따라 확인을 완료하세요. 권한이 사라졌다는 알림만 닫거나 시스템 보안 설정을 삭제해 권한 부여를 우회하지 마세요.

  4. 코어를 다시 시작하고 실제 버전을 확인하세요

    코어 재시작 메뉴를 사용한 뒤 코어 카드에 v1.19.32가 표시되는지 확인하세요. 로그 반복이 멈추면 뒤에 나오는 체크리스트에 따라 TUN을 복구하고 테스트하세요. 성공 메시지나 다운로드된 파일만으로는 실행 중인 버전을 확인할 수 없습니다.

일반 업데이트 버튼과 특정 버전 선택은 서로 다른 작업입니다. 여기서는 특정 버전을 선택해 확인 대상을 고정합니다. 이후 버전은 릴리스 안내를 별도로 확인해야 하며, 앞으로 나올 모든 버전이 검증됐다고 미리 판단해서는 안 됩니다. 다운로드, 검증, 권한 부여, 시작 중 어느 단계든 실패하면 그 단계에서 멈추세요. 코어, 구독, DNS 설정을 연달아 바꾸지 마세요.

스택을 비교해야 한다면 stack만 바꾸고 기존 설정을 보관하세요

먼저 확인된 코어 수정을 적용하세요. 임시 비교가 꼭 필요하다면 직접 관리하는 로컬 덮어쓰기 설정에서 tun.stack만 mixed에서 gvisor로 바꾸고 기존 값과 백업을 보관하세요. 기존 설정이 mixed가 아니거나 클라이언트에 지원되는 덮어쓰기 메뉴가 없다면 이 단계를 그대로 따라 하지 마세요.

아래 예시는 바꿀 필드만 나타내며 전체 설정 파일이 아닙니다. 기존 DNS, 라우팅, 장치 이름, 구독, 나머지 TUN 항목을 유지하세요. 적용 후 최종 실행 설정이 실제로 gvisor인지 확인하고 코어를 정상적으로 다시 시작하세요. 원격 구독을 수정하거나 strict-route까지 함께 바꿔 비교 결과를 불분명하게 만들지 마세요.

임시 비교에서는 기존 tun의 stack만 수정하세요
tun:
  stack: gvisor

#3310에서 한 번의 복구는 재시작과 설정 변경을 함께 수반했습니다. 복구를 gVisor만의 효과로 보거나 장기간 재발하지 않는다는 근거로 삼을 수는 없습니다. 공식 문서는 system, gvisor, mixed의 구현을 구분하며 새로울수록 더 좋다는 순위를 매기지 않습니다. 같은 작업에서 달라진 점을 기록하고 개선이 없으면 기존 stack으로 되돌리세요. 새 설정을 곧바로 영구적인 해결책으로 삼지 마세요.

로그 반복이 멈추면 CPU 사용률과 실제 연결도 확인하세요

같은 설정과 비슷한 부하에서 코어와 클라이언트 두 프로세스를 관찰한 뒤 이전에 실패했던 웹사이트나 앱 요청을 다시 실행하세요. 다른 사람의 CPU 수치를 합격 기준으로 사용하지 마세요. 자신의 변경 전후 지속적인 사용률과 로그 증가량을 비교하고, 한 번의 순간적인 감소를 장기적인 결과로 해석하지 마세요.

로그 반복이 멈췄다고 TUN 연결까지 복구된 것은 아닙니다. 여전히 접속되지 않으면 TUN을 끈 상태로 코어 시작, 권한 부여, 현재 프로필 적용 여부를 하나씩 확인한 뒤 정상적으로 재시작하고 원래 요청을 다시 테스트하세요. 로그 수준을 계속 높이거나 동시에 DNS를 바꾸며 해결책을 추측하지 마세요.

수정 후 항목별로 확인하세요

  • 실행 중인 코어 버전이 v1.19.32인지 확인하고 클라이언트 버전은 따로 기록
  • TUN에 필요한 권한 부여가 완료됐고 기존 구독과 로컬 설정을 계속 불러올 수 있음
  • 같은 패킷 읽기 오류가 빠르게 반복되지 않으며 로그 증가량이 정상으로 돌아옴
  • 비슷한 부하에서 코어와 클라이언트가 CPU를 지속적으로 비정상 사용하지 않음
  • 기존 작업 요청, 직접 연결과 프록시 접속, 실제로 필요한 UDP 기능을 각각 확인
  • 코어를 정상적으로 다시 시작한 뒤 재확인하고 기존 채널, stack, 별도 백업을 보관

업그레이드나 비교가 실패하면 어떻게 복구하고 보고하나요?

stack을 임시로 바꿨다면 먼저 기록해 둔 기존 값으로 복원하고 코어를 다시 시작하세요. 기본적인 인터넷 연결이 복구될 때까지 TUN을 끈 상태로 유지하세요. 필요하면 이전에 사용 가능했고 지원되는 시스템 프록시 방식을 이용하세요. 모든 앱에 적용된다고 가정하거나 클라이언트 데이터 폴더 전체를 삭제하지 마세요.

새 코어가 시작되지 않으면 백업을 바탕으로 기존 채널, 정확한 코어 버전, 설정을 복원하고 클라이언트 안내에 따라 권한을 다시 부여하세요. 이전 코어에는 이번 오류 반복 문제가 남아 있을 수 있으므로 알려진 발생 조건에서 장기적인 해결책으로 사용해서는 안 됩니다. 되돌린 뒤 오류가 다시 반복되면 TUN을 끄고 사용할 수 있는 연결 방식을 유지한 채 재시도를 멈추세요. 프로그램 다운그레이드와 설정 복구를 같은 작업으로 여기지 마세요.

재발한다면 macOS 버전과 아키텍처, 클라이언트와 실제 코어 버전, stack, 권한 상태, 확보할 수 있는 가장 이른 시점의 짧은 오류 기록, 재시작 전후 및 변경 전후 차이를 제공하세요. 설정 다시 불러오기, 잠자기에서 깨어나기, 네트워크 전환은 실제 관찰한 내용만 기록하세요. 시각이 가깝다는 이유로 원인이라고 판단하지 마세요. 공유하기 전에 구독 토큰, 비밀번호, 비공개 도메인, 이 기기의 식별 정보를 삭제하세요.

참고 자료