ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • macOS 한영전환 문제
    카테고리 없음 2022. 4. 1. 15:23

    TLDR.

    watch -n 1 launchctl kickstart -p gui/501/com.apple.TextInputSwitcher

     

     

    Apple 에서 M1 기반 mac을 새로 내놓았다고 해서 오랬만에 macbook air M1 깡통 버젼을 하나 사 보았다. 예전에 PPC에서 X86이전할때도 그렇게 훌륭하게 이전해서 별 걱정 없이 구매를 해 주었다. 훌륭한 애플.. 8G memory로도 전반적으로 빠릿 빠릿한게 아주 마음에 들었다. arm cpu를 사용하긴 하지만, 로제타가 워낙 훌륭해서 별로 불편한건 없었다. 이미 출시된지 일년 가까운 시간이 흘러서 대부분의 app들의 arm version이 이미 있기도 해서 말이지. 

     

    그런데, 이것저것 설치하고, 사용함에 따라서 한영전환이 잘 안되는 이상한 증상이 나타나기 시작했다. 그냥 잘 되는 듯 보이다가, 무언가 다른걸 하다가 한영전환 key를 누르면 서너번, 3~4초 동안 한영전환 키가 씹히는 증상이 나타났다.

     

    검색을 해보니, CMD+Space 가 시리랑 충돌해서 그러니, karabiner로 오른쪽 CMD키를 F18로 바꾸고, 한영키를 F18로 설정하면 된다. 그런데, karabiner가 아직 apple chip을 지원을 안하니, hammerspoon을 쓰면 된다.. 라는 무언가 이상하고 이해가 안되는 글들이 발견되었다.  해 보지 뭐. 그렇게 하면 된다는 사람들이 있으니... 라고 생각하고 해머스푼 설치하고, 키매핑 바꾸고, 뭔가 알수 없는 lua foundation library 가져다 밀어 넣고.. 하라는거 다 하고 오른쪽 CMD 를 한글키로 mapping을 끝내고 나니..

    당연히 잘된다. 어.. 잘되는거 맞나? 하고 삼십분이 채 안되. 마찬가지로 한영키 입력이 씹히는 증상이 나타났다.

     

    하루에 한두서너번, 너대여섯번.. 뭐 그정도 발생하는거라 불편함을 안고 3개월 가량을 사용하다가 인내심에 한계가 와서 원인을 찾아보기 시작했다.

     

    일단, 느낌들을 기억해 보니,  한영키 전환을 담당하는 어떤 process가 사용을 안하는동안 swap out 되었다가, 한영키를 누르는 순간 swap in 이 되면서 느려지는 상황으로 체감되었다. 일단 해당 프로세스가 어떤놈인지를 찾아내고, swap out이 안되도록 하면 좀 나아지지 않을까.. 하는 기대를 하면서 Activity Monitor를 띄워 놓고 한영키 연타를 때려 보았다.

     

     

    아니나 다를까, TextInputSwitcher라는 놈과 textInputMenuAgent 라는 놈이 2~4%의 CPU 사용량을 보이면서 치고 올라오는게 보였다. 저놈이다 TextInputSwitcher..

     

    이제 저놈의 priority를 높여주어서 swap out이 안되도록 해 주면 되겠지 라는 생각으로 priority를 조정하는 커맨드를 뒤져 보니  

    sudo renice -n -20 pid

    를 해주면 된다고 해서 renice를 해주니, 당연히 잘된다. 원래 잘 됬지 될때는....  30분쯤 뒤, 다시 한영키가 씹히는 증상이 발생해서 좌절을 하면서 ps로 상태를 보니, -20 을 준 nice값이 어디론가 사라지고 0으로 되어 있는게 아닌가. 이에 격분하여 nice값을 다시 -20으로 주고 

     

    watch 'ps axl | grep -i TextInput'

    커맨드로 nice값을 쳐다보고 있었더니, 어느순간 TextInputSwitcher process가 사라지는게 아닌가.

    이런.. 죽었나.. input switer의 버그로, 가끔 죽는 문제인가? 곤란한데.. 라고 생각하며 

    /var/log/com.apple.xpc.launchd

    에 있는 log를 확인해 보니

    2022-04-01 12:35:40.707579 (gui/501/com.apple.TextInputSwitcher [76295]) <Notice>: service exited: dirty = 0, supported pressured-exit = 1
    2022-04-01 12:35:40.707598 (gui/501/com.apple.TextInputSwitcher [76295]) <Notice>: jettisoned: JETSAM_REASON_MEMORY_IDLE_EXIT
    2022-04-01 12:35:40.707603 (gui/501/com.apple.TextInputSwitcher [76295]) <Notice>: service state: exited
    2022-04-01 12:35:40.707608 (gui/501/com.apple.TextInputSwitcher [76295]) <Notice>: internal event: EXITED, code = 0
    2022-04-01 12:35:40.707615 (gui/501/com.apple.TextInputSwitcher [76295]) <Notice>: job state = exited
    2022-04-01 12:35:40.707668 (gui/501 [100012]) <Notice>: service inactive: com.apple.TextInputSwitcher
    2022-04-01 12:35:40.707708 (gui/501/com.apple.TextInputSwitcher [76295]) <Notice>: service state: not running
    2022-04-01 12:35:40.707723 (pid/76295 [TextInputSwitch]) <Notice>: shutting down

    죽은게 아니다, 죽임을 당한거다. 왜? 메모리가 부족해서.

     

    미친 애플, 아무리 메모리가 부족해도 그렇지, 한영전환하는 process를 메모리가 부족하다고 죽이는게 말이 되?

    저 프로세스가 죽어 있으면, 프로세스 올리고, 초기화 하는 동안 한영키가 작동하지 않던 거였다.

     

    그럼 어떻게 할까 하면서 좀더 살펴 보니

    /System/Library/LaunchAgents/com.apple.TextInputSwitcher.plist

    file이 해당 process에 대한 설정을 하는 파일인데, 저 파일안에.

        <key>EnablePressuredExit</key>
        <true/>

    와 같은 구절이 있는게 아닌가. "메모리 압박이 있으면, 얘는 죽여도 돼" 라고 써져 있는거였다.

     

     

    아무리, 애플이 영어를 주 언어로 쓰는 나라의 회사라고 해도 조금 너무한다는 생각.. 은 사치고, 일단 나라도 살아야지 하면서 저 'true'를 'false'로 고치고 저장하려고 하니, 저장이 안된다. 그래서 sudo 로 root 권한으로 편집을 해서 저장을 하려고 해도 안된다. 뭐지?

    잠시 당황하다가, 구글님께 이게 도대체 어떻게 된 일입니까? 하고 여쭈어 보니

     

    macOS 에는 SIP 이라는 것이 있느니라..

     

    라는 계시를 주시었다. System Integrity Protection이라는 놈으로  system file들이 있는곳, /System 아래 같은곳은 read-only로 mount가 되어서 어떤 방법으로도 고칠 수 없다고 한다. 그나마 catalina 까지는 SIP 을 끄고 부팅하면 rw로 mount가 가능했던 모양인데, monteray 에 와서는 SIP을 끄고도, 스냅샷을 다시 만들고 어쩌고 해야지 수정이 가능하다고 한다.

     

    이제 포기해야 하나, 하면서 launchctl manual 을 읽다가 kickstart 라는 sub command를 발견.

    Instructs launchd to run the specified service immediately, 
    regardless of its configured launch conditions.

     

    그래,  macOS가 죽이면 내가 띄워주면 되지 라는 생각에 

    watch -n 1 launchctl kickstart -p gui/501/com.apple.TextInputSwitcher

    command로 1초에 한번씩 TextinputSwitcher의 엉덩이를 kick 해 주었더니,

    한영전환이 버벅거리는 경우가 거의 없어졌다. 정말 거의.. 없어졌다. 아예 없어졌다고 말하긴 어려운데, 아마도, 다른 app으로 전환하자마자 메모리가 부족하여, TextInputSwitcher죽이는 시점에, 한영전환키를 누르는 정도의 상황에는 드물게 발생하긴 한다. 

     

    한영전환이 가끔 씹혀서 두어달 스트레스 받던게 드디어 잡혔다.

     

    apple이 저 plist file의 EnablePressuredExit 를 false로 바꾸어서 릴리즈 해주면.. 해결될 듯 한데, 일단은 엉덩이를 kick해 주면서, 어차피 내가 kick하는건 아니니, 사용하고 있다.

    혹시, 내부적으로는 죽이지 않고 오래 살아있으면 먹통이 되는 버그가 있는데, 그걸 고치기 귀찮아서 그냥 가끔 죽이는걸로 설정해서 릴리즈 했을지도 모르겠다.

     

    이상 오랬만에, 삽질기 끝...

    댓글

Designed by Tistory.