Coder Social home page Coder Social logo

troubleshooting's People

Watchers

 avatar

troubleshooting's Issues

gcp vpc 설정 삽질

문제상황

gcp에 vcp를 새로 만들었고, 해당 vcp에 gce 리소스를 만들었다. 그리고 외부 ip로 ping을 날렸는데 동작하지 않는다. default로 생성된 vcp에 gce 리소스를 하나 만들어서 외부 ip를 날렸는데 동작한다. 무엇이 문제일까 확인한다.

확인사항

1 방화벽

처음 만들면 아래와 같은 사항들을 선택할 수 있다.
스크린샷 2022-03-13 22 26 25

일단 vcp를 만들때 무시했다. 그리고 나서 모든 IP를 대상(0.0.0.0)으로 모든 포트(0-65535)를 오픈했다.

여기서 icmp가 무엇인지 확인한다.

1.1 icmp

네트워크 ICMP란?

위의 글에 따르면

  • ICMP는 TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜이라고 한다.
  • IP에는 패킷을 목적지에 도달시키기 위한 내용들로만 구성되어져 있기 때문에 정상적으로 도달하지 못하는 경우에 대한 상황을 출발지 호스트로 알려주지 못하는 문제가 있다. 이걸 해결해주는게 ICMP라는 녀석이다.

그래서 ICMP는 언제사용되는가?

  • 우리가 잘 쓰는 ping도 ICMP를 쓴다고 한다.
  • 그래서 모든 포트에 대해서 icmp를 허용하도록 했더니 외부 ip로 ping을 하니 정상적으로 ping 확인이 된다.

참고

bigquery 파티셔닝 테이블 핸들링

파티션된 테이블

생성

  • 생성 시 삽질
  • 파티션 날짜와 실제 데이터의 날짜가 다르면 아래의 에러가 발생함
  • message: 'Some rows belong to different partitions rather than destination partition 20220112'
ALTER TABLE `project_id`.dataset_id.table_id
SET OPTIONS (partition_expiration_days=NULL);

참고

querydsl N + 1

join 없이 join맺은 테이블을 조회할 수 있으나 각각의 쿼리가 발생한다.(N + 1 이슈)
fetchjoin을 사용하면 뭉탱이로 쿼리를 날린다.

이건 따로 정리를 하자

docker 사용시 Errcode: 28 "No space left on device" 에러

도커를 쓰다보면 여유공간이 없어서 여러가지 장애가 발생하는 경우가 있다.

$ docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y

docker system prune -a

해당 명령어로 해결이 되기는하는데... 한번 어떤 이슈인지는 확인해볼 필요가 있다.

로거를 통해서 로그를 남길 때 주의사항

  • trace를 남길 때에는 중앙에서 관리하도록 하는게 좋다. 왜냐하면 여러 곳에서 남길 경우 정보의 중복이 발생하고, 관리가 잘 안된다.
  • 만약 로그를 남긴다면 trace를 남기지 말고 정보를 남겨라.

spring boot package 버전 확인

상황

  • openfeign을 추가하려고 한다.
  • 현재 spring boot 2.6.2인데 openfeign은 어떤 버전을 써야하나?

패키지 호환은 어떻게 알 수 있을까?

  • 일단 spring-boot가 패키지 버전 호환을 고려해서 적당한 버전을 넣어주는게 기본이다. 그래서 보통은 버전을 명시할 일이 없다.
    • 그런데, 버전을 명시하지 않으면 안되는 경우가 있다. 이번처럼...
    • 그러면 버전을 찾으러 가야한다.
    • https://spring.io/projects/spring-cloud-openfeign#learn
    • 여기에 가보면 github 링크를 볼 수 있다. 여기서 pom.xml을 보자 보통은 여기까지 보면 확인이된다.
    • 그런데 4.0.0이라고 기록되어져 있지만 current 버전은 3.1.1이었다.
    • 다른 프로젝트처럼 implementation("org.springframework.cloud:spring-cloud-starter-openfeign:3.1.1:RELEASE") 라고 써봤다. 그런데 계속 import가 안된다..
  • 패키지 임포트 현황을 보기 위해서 gradle > build dependencies를 사용해보자
  • 스크린샷 2022-04-22 21 54 42 - 3.1.1RELEASE FAILED라고 쓰여있는걸 볼 수 있다. 그러면 어떻게 임포트하라는거지..? - 구글에 `org.springframework.cloud:spring-cloud-starter-openfeign` 통으로 검색해보니 [https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign/3.1.1](https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign/3.1.1) 여기에 들어갈 수 있었다... RELEASE를 빼고 입력하기 패키지 import 완료...!

추가로 spring-boot 2.6.2는 어떤 버전을 써야할까? 4.0.0 vs 3.1.1

  • 일단 openfeign은 spring-cloud 프로젝트이다.
  • 그러면 spring-cloud와 spring-boot의 버전 호환을 확인해야한다.
    • https://spring.io/projects/spring-cloud
    • 스크린샷 2022-04-22 21 41 38
    • 위의 표를 보니까 spring-cloud: 2021.0.x aka Jubilee > spring-boot: 2.6.x 이렇게 호환된다.
    • 4.0.0을 써야하는지 3.1.1을 써야하는지 어떻게 결정하는지는 잘 모르겠다. 일단 최신버전을 해보니 잘 된다;;

ES 로그 저장 불가

로그

[2021-11-21T00:00:31,906][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 403 ({"type"=>"cluster_block_exception", "reason"=>"index [stb-2021.11.20] blocked by: [TOO_MANY_REQUESTS/12/index read-only / allow delete (api), FORBIDDEN/8/index write (api)];"}) | 2021-11-21T00:00:33.949Z

접근 및 해결 방법

  1. 해당 로그가 무엇을 의미하는지 파악한다.

쓰기 불가, 읽기만 가능

  1. 왜 이런 상황이 발생했는지 파악한다.

ES 스토리지 여유공간이 95% 이하가 되면 write lock 으로 상태가 변경됨

  1. 근본적인 해결 방법 적용

ES 스토리지를 비우고, write lock을 해제한다.

  1. 미리 파악할 수 있는 트리거를 추가한다.

cloudwatch에서 경보를 추가한다.

참고글

서버 부하확인

문제상황

  • 고객사에서 평상시와 다른 패턴으로 편성을 요구했다.
  • 즉각적으로 편성되기를 원해서, 각 플레이어들의 다운로드 제한시간을 해제했다.
  • CPU사용률이 3시간이상 30프로 이상을 유지하고 있었다.
  • 평상시와는 다른 모습니다.

원인 조사

  1. CPU 부하
  • 평상시보다 CPU 사용량이 많았다.
  • 평상시보다 네트워크에서 받은 요청이 많았다.
  • 평상시보다 네트워크에서 쓰기 요청도 많았다.
    스크린샷 2021-12-07 11 14 58
  1. I/O 부하�
  • 평상시보다 메모리 사용량이 많았다.
    스크린샷 2021-12-07 11 13 31
  1. DB 상태 확인
    스크린샷 2021-12-07 11 16 09
  • 11/29 편성 테스트 때문에 스왑메모리가 사용된 것으로 보임
  • 12/2 스왑메모리 사용량 증가, 여유 메모리 공간이 줄어들음, 이때 innodb_pool_size를 증가시켰음 (75% > 80%)
  • pool_size는 캐시와 관련하여 읽고 쓰는 성능을 향상시킴

결론

  • 사용가능한 메모리가 줄어들면서 애플리케이션의 지연이 발생한 것으로 확인

조치

  • innodb_pool_size를 다시 줄였음. 이로 인해서 여유 메모리 공간이 확보됨. 경과는 살펴보아야함

celery task received but not executed

문제상황

  • celery worker가 task를 받은(status: received) 후에 실행을 하지 못함
  • worker의 상태 또한 offline

원인

  • 핵심적인 원인은 사용방식 때문이다.
  • celery 사용시 과한 메모리 사용한다.
  • ex. backend.mqtt.tasks.mqtt_from_screen
  • 전달하는 데이터의 양이 매우 많다.
    image

분석

  • 지표 확인
    image

  • 메모리 사용이 100%에 가까워짐

  • 로그 확인

  • sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back

  • billiard.exceptions.WorkerLostError: Worker exited prematurely: signal 9 (SIGKILL) Job: 1918.

  • ...

  • [Errno 12] Cannot allocate memory

  • 프로세스가 kill됨

  • 메모리가 부족하게 되면서 프로세스를 강제로 종료함(oom killer)

  • 프로세스가 죽으면서 CPU 사용률이 떨어지게됨

  • 메모리 할당 불가

  • 메모리에 여유가 생기면서 실행을 하려고 하지만 celery_once를 사용함에 따라 중복된 task를 실행할 수 없는 상태

  • raise AlreadyQueued(ttl / 1000.)

문제 해결방식

  • 워커에 할당된 리소스(CPU, Memory 2배)를 증가시킴

주의사항

  • 브로커에 그간 쌓여있던 task 중에서 DB에 접근하는 task일 경우 전체 서비스에 영향을 줄 수 있음

그외 작업

  • memory 사용량에 따른 알림 추가

앞으로 추가 작업

  • 메모리를 많이 잡아먹는 로직을 개선할 필요가 있음
  • ex. 데이터를 많이 전달받는 task

dataflow에서 스케쥴은 잡히는데, airflow webserver ui에서는 task state가 왜 자꾸 no_state로 잡힐까?

문제상황

dataflow에서 스케쥴은 잡히는데, airflow webserver ui에서는 task state가 no_state로 잡히는 문제

원인

동적으로 task_name을 설정하다보니 상태가 표시가 안된다.
스크린샷 2021-12-24 16 25 20

태스크 인스턴스에서 이전 태스크의 상태를 확인할 수 있다. 백필을 고려해서 이렇게 태스크 이름을 처리한 것들이기는 한데...음...

ERROR!!!: Too old Airflow version !

문제상황

Dockerfile에 명령어가 들어가면 <ERROR!!!: Too old Airflow version !>를 뱉어버린다.

원인

Dockerfile
COPY ./${환경변수} .

여기서 환경변수가 제대로 넘어가지 않는 문제가 때문에 그랬다...허무하다...
로그를 보면...

COPY ./ .

local에서는 다음과 같은 커맨드로 환경변수가 넘어가지 않는다.

docker-compose --env-file <env/file/path> up

AIRFLOW_UID, AIRFLOW_HOME가 없으면 이런 문제가 발생하는 것 같다.

docker로 django server 띄우기

크게 문제가 되는 부분은 없으나 shell 명령어를 새롭게 배움

  • python3를 설치하더라도 python 명령어로 python3를 실행하지 않으므로 링크를 해주어야한다.
ln -s /usr/bin/python3 /usr/bin/python
  • $1은 shell로 들어온 첫번째 인풋을 뜻한다.
  • case 문이므로 $1인 var 이면 = var)이다
  • 그렇게 되면 그 아래 명령을 실행하게 된다.
  • exec는 그냥 쉘에서 명령어를 때리는 것과 조금 다르다. 끝나면 해당 쉘에서 나오지 않는다.
#!/usr/bin/env bash

var=$1

case $var in
  ad_platform_web)
    ./manage.py migrate
    exec gunicorn -c gunicorn_config.py 'config.wsgi:application'
    ;;
esac

flask sqlalchemy onupdate

updated_at에서 onupdate 옵션을 True로 두어서 sqlalchemy로 쿼리를 날리면 update_at이 바뀌는 상황

하지만 나는 update_at이 업데이트 되지 않으면서 일부 컬럼 값을 변경하고 싶었다.

한참 고민했고, 결국 sqlalchemy는 application 수준의 처리이기 때문에 raw sql을 사용하자는 아이디어!

실제로 raw sql을 사용하니 updated_at이 안바뀌었다.

참고로 maria db에서는 subquery에 limit을 쓸 수 없었다. 그래서 아래처럼 사용했다.

db.session.execute(
    'UPDATE playlist SET is_simple = 1 WHERE id IN (SELECT * FROM (SELECT id FROM playlist WHERE name = :val LIMIT 1000) as tmp)',
    {"val": "Digital Menu Board"}
)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.