일상의 정리

LG Gram 노트북 리눅스 CPU 점유 문제 해결

리눅스/설치

LG Gram 16ZD90Q-GX56K 모델에서 Linux Mint 등 리눅스를 설치해 사용하다 보면, irq/9-acpi 프로세스가 CPU를 과도하게 점유하는 문제가 발생할 수 있습니다.

특히 USB-C 충전 중일 때 CPU 사용량이 50% 이상 치솟고, 충전기를 빼면 정상으로 돌아오는 증상이 대표적입니다.

증상

  • top -H 명령어로 확인 시 irq/9-acpi 스레드가 CPU를 40~60% 차지
  • 충전기를 USB-C 포트에 연결하면 CPU 점유율 급상승
  • 충전기를 분리하면 정상으로 내려감
  • 배터리 관리 및 ACPI 이벤트 처리와 관련된 문제

원인

USB-C Power Delivery (PD) 이벤트를 ACPI 펌웨어가 리눅스 커널에 잘못 전달하면서, 커널이 ACPI General Purpose Event(GPE)를 무한히 받아 IRQ storm이 발생하는 현상입니다.

해결 방법

1. 임시 조치 (런타임 적용)

echo "mask" > /sys/firmware/acpi/interrupts/sci
echo "mask" > /sys/firmware/acpi/interrupts/gpe6E
echo "disable" > /sys/firmware/acpi/interrupts/sci
echo "disable" > /sys/firmware/acpi/interrupts/gpe6E

➡ 이렇게 하면 즉시 CPU 점유율이 정상으로 내려갑니다.
단, 재부팅하면 초기화되므로 자동 적용이 필요합니다.

2. 부팅 시 자동 적용 (systemd 서비스)

  1. 스크립트 작성
    sudo nano /usr/local/bin/fix-acpi-irq.sh
    #!/bin/bash
    echo "mask" > /sys/firmware/acpi/interrupts/sci
    echo "mask" > /sys/firmware/acpi/interrupts/gpe6E
    echo "disable" > /sys/firmware/acpi/interrupts/sci
    echo "disable" > /sys/firmware/acpi/interrupts/gpe6E
    sudo chmod +x /usr/local/bin/fix-acpi-irq.sh
  2. systemd 유닛 파일 생성
    sudo nano /etc/systemd/system/fix-acpi-irq.service
    [Unit]
    Description=Fix ACPI IRQ storm issue on LG Gram
    After=multi-user.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/fix-acpi-irq.sh
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
  3. 서비스 등록 및 활성화
    sudo systemctl daemon-reload
    sudo systemctl enable fix-acpi-irq.service
    sudo reboot

Reverse Proxy 뒤의 Spring Boot가 http로 redirect되는 문제

리눅스/설치

Reverse Proxy 서버로 Nginx를 사용하고, Application Server 로 tomcat / spring boot 를 사용 시, https 요청에 대해 웹앱에서 발생되는 redirection을 무조건 http로 처리하게 된다.

https/http 2개의 포트를 동시에 열어서 http를 https 로 자동 redirection 하는 경우에는 문제를 못 느끼지만 http(80) port를 열지 않고 https(443) port만 열어서 운영을 하게 될 경우 웹앱의 redirection 은 모두 connect 에러가 발생되게 된다.

해결방법

  • 인터넷을 검색해 보면 여러가지 해결 방법이 나오는데 나의 경우에는 일반적인 방법이 실제로 되지 않았다.
  • 실행 환경은 Nginx v1.20.1 / Tomcat 10.1.13 / OpenJDK 17.0.6 이었다.
  • 해결을 위해서는 nginx.conf 와 spring boot 의 application.properties 2군데에 설정을 추가해 줘야 한다.

nginx.conf 에는 아래 구문이 설정 되어 있어야 한다.

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $server_name;
    proxy_set_header X-Forwarded-Proto $scheme;
}

application.properties 에는 맨 아래 아래 구문이 필요하다.

server.forward-headers-strategy =FRAMEWORK

이렇게 설정하고 nginx 와 tomcat을 모두 재시작 하면 http, https 에 맞게 변경되어서 redirection 된다.

Informix 정리

프로그래밍/C++

docker 로 Informix developer 실행하기 (아래 사이트 참고)

https://github.com/informix/informix-dockerhub-readme/blob/master/14.10.FC9W1/informix-innovator-c.md

docker run -it --name ifx -h ifx --privileged -p 9088:9088 -p 9089:9089 -p 27017:27017 -p 27018:27018 -p 27883:27883 -e LICENSE=accept ibmcom/informix-developer-database:latest
docker start ifx
docker stop ifx

[[docker shell]]
docker exec -it ifx bash
$ dbaccess - -

 

개발 시 환경 설정

먼저 Informix SDK 를 압축을 풀어서 설치하고 설치한 위치를 INFORMIXDIR 환경 변수에 넣어 줘야 한다.

그 후 $INFORMIXDIR/etc/sqlhosts 파일에 Informix 서버의 정보를 설정해 준다.

만약 CLI 모드로 접속을 할 경우에는 odbc.ini 에 설정 정보를 넣어 주고 환경 변수도 설정해 주어야 한다.

 export INFORMIXSERVER=informix
 export INFORMIXDIR=/opt/IBM/Informix_Client-SDK
 export LD_LIBRARY_PATH="$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:$INFORMIXDIR/lib/cli"
 export ODBCINI=$INFORMIXDIR/etc/odbc.ini