sample code

// Sample code
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){

    srand(time(NULL));

    int count = 0;

    for(;;){
        int random_number = rand() % 100;

        if(random_number > 95)
            break;
        else if(random_number > 100)
            continue;
        else
            count++;
    }

    printf("count : %d\n", count);

}

build & execute

gcc --coverage -o coverage coverage.c
./coverage
  • --coverage 옵션으로 컴파일 하고, 실행하면 같은 경로에 .gcda, .gcno 파일이 생성된다.
  • gcda: 커버리지 정보 및 실행 횟수가 포함(동일경로에 생성되지만 -fprofile-dir 옵션으로 경로 설정 가능)
  • gcno: 기본 블록 그래프를 재구성하고 블록에 소스 라인 번호를 할당하는 정보가 포함.(동일경로에 생성)

analysis

gcov

gcov coverage.c 
// 같은 경로에 coverage.c.gcov 파일 생성

cat coverage.c.gcov
/*
        -:    0:Source:coverage.c
        -:    0:Graph:coverage.gcno
        -:    0:Data:coverage.gcda
        -:    0:Runs:1
        -:    1:#include <stdio.h>
        -:    2:#include <stdlib.h>
        -:    3:#include <time.h>
        -:    4:
        1:    5:int main(){
        -:    6:
        1:    7:    srand(time(NULL));
        -:    8:
        1:    9:    int count = 0;
        -:   10:
       28:   11:    for(;;){
       29:   12:        int random_number = rand() % 100;
        -:   13:
       29:   14:        if(random_number > 95)
        1:   15:            break;
       28:   16:        else if(random_number > 100)
    #####:   17:            continue;
        -:   18:        else
       28:   19:            count++;
        -:   20:    }
        1:   21:    printf("count : %d\n", count);
        -:   22:
        -:   23:}
*/
  • 가장 왼쪽 숫자는 해당라인 실행횟수이며 #####은 미실행 라인

gcovr

  • gcov 파일을 시각화 하여 파싱해주는 툴
gcovr --html-details -r . --html coverage.html
gcovr -r . --csv coverage.csv
gcovr -r . --json coverage.json

 

 

'리눅스' 카테고리의 다른 글

Transparent Huge Page  (0) 2024.03.20
get realtime output of ssh remote command  (0) 2023.11.08
Core dump not generated  (0) 2023.06.13
Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04

About Transparent Huge Page

리눅스에서 메모리를 관리할 때 사용하는 페이지의 크기는 일반적으로 4kb이다. 
이 페이지를 통해 메모리를 분할하여 관리하는데, 메모리의 크기가 커질수록 페이지 수가 많아진다.
이렇게 되면 페이지를 관리하는 TLB(Translation Lookaside Buffer)의 크기도 비례하여 커지는데 이를 방지하는 기법이 THP(Transparent Huge Page)이다.
THP를 통해 페이지의 크기를 증가시키고(기본적으로 4kb -> 2mb), 이렇게 되면 페이지의 갯수가 줄어들어 TLB의 크기도 작아지는 방식이다.

메모리가 100기가 이상인 서버급 컴퓨터에서 THP를 활용하거나, 
메모리 집약적인 워크로드를 수행하는 동작에 대해서 THP를 활용하는 경우에는 성능적으로 큰 효과가 있을 수 있지만, 
일반적으로 데스크탑 PC나 임베디드 보드의 경우에는 오히려 성능 저하를 야기할 수 있다.
때문에 리눅스가 동작하는 하드웨어의 스펙에 따라 THP를 끄는게 성능적으로 좋은 경우도 있다.

일반적인 PC급 HW나 서버급 워크스테이션에서는 THP가 조건부 적용되도록 설정되어있지만, 임베디드 보드의 경우 기본적으로 사용하는것으로 설정되어있다.

How to disable THP

# check whether enabled or disabled
cat /sys/kernel/mm/transparent_hugepage/enabled

# [always] madvise never

# always: madvise() 시스템콜에 인자로 MADV_NOHUGEPAGE 옵션을 전달하지 않은 모든 프로세스가 THP 사용
# madvise: madvise() 시스템콜에 인자로 MADV_HUGEPAGE 옵션을 전달한 프로세스가 페이지 폴트시 THP 사용
# never: 시스템에서 THP를 완전하게 비활성화

# https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-configuring_transparent_huge_pages

###############################################################

# turn off once
echo never > /sys/kernel/mm/transparent_hugepage/enabled

# turn off completely
vi /etc/systemd/system/disable-thp.service

# disable-thp.service contents
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target


systemctl daemon-reload
systemctl start disable-thp
cat /sys/kernel/mm/transparent_hugepage/enabled
systemctl enable disable-thp
reboot

'리눅스' 카테고리의 다른 글

How to measure code coverage using gcov  (0) 2024.04.24
get realtime output of ssh remote command  (0) 2023.11.08
Core dump not generated  (0) 2023.06.13
Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04

passwordless ssh setting

ssh-keygen -t rsa -b 4096
ssh-copy-id user@remote_ip

get realtime output of ssh remote command

ssh user@remote_ip "cd __; stdbuf -oL ./test"

'리눅스' 카테고리의 다른 글

How to measure code coverage using gcov  (0) 2024.04.24
Transparent Huge Page  (0) 2024.03.20
Core dump not generated  (0) 2023.06.13
Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04

sysctl -w kernel.core_pattern=core


echo core >/proc/sys/kernel/core_pattern

'리눅스' 카테고리의 다른 글

Transparent Huge Page  (0) 2024.03.20
get realtime output of ssh remote command  (0) 2023.11.08
Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04
How to construct reverse proxy and load balancer using Nginx  (0) 2020.04.27
SIGHUP 1 Hangup (POSIX) Terminate
SIGINT 2 Terminal interrupt (ANSI) Terminate
SIGQUIT 3 Terminal quit (POSIX) Core Dump
SIGILL 4 Illegal instruction (ANSI) Core Dump
SIGTRAP 5 Trace trap (POSIX) Core Dump
SIGABRT 6 Aborted Core Dump
SIGBUS 7 BUS error (4.2 BSD) Core Dump
SIGFPE 8 Floating point exception (ANSI)  
SIGKILL 9 Kill(can't be caught or ignored) (POSIX) Terminate
SIGUSR1 10 User defined signal 1 (POSIX)  
SIGSEGV 11 Invalid memory segment access (ANSI) Terminate + Core Dump
SIGUSR2 12 User defined signal 2 (POSIX)  
SIGPIPE 13 Write on a pipe with no reader, Broken pipe (POSIX)  
SIGALRM 14 Alarm clock (POSIX)  
SIGTERM 15 Termination (ANSI) Terminate
SIGSTKFLT 16 Stack fault  
SIGCHLD 17 Child process has stopped or exited, changed (POSIX) Ignore
SIGCONTv 18 Continue executing, if stopped (POSIX) Restart
SIGSTOP 19 Stop executing(can't be caught or ignored) (POSIX) Suspend
SIGTSTP 20 Terminal stop signal (POSIX) Suspend
SIGTTIN 21 Background process trying to read, from TTY (POSIX)  
SIGTTOU 22 Background process trying to write, to TTY (POSIX)  
SIGURG 23 Urgent condition on socket (4.2 BSD)  
SIGXCPU 24 CPU limit exceeded (4.2 BSD)  
SIGXFSZ 25 File size limit exceeded (4.2 BSD)  
SIGVTALRM 26 Virtual alarm clock (4.2 BSD)  
SIGPROF 27 Profiling alarm clock (4.2 BSD)  
SIGWINCH 28 Window size change (4.3 BSD, Sun)  
SIGIO 29 I/O now possible (4.2 BSD) Terminate
SIGPWR 30 Power failure restart (System V)  

 

'리눅스' 카테고리의 다른 글

get realtime output of ssh remote command  (0) 2023.11.08
Core dump not generated  (0) 2023.06.13
How to use ctags  (0) 2020.11.04
How to construct reverse proxy and load balancer using Nginx  (0) 2020.04.27
How to kill a network session in Linux  (0) 2020.03.19

ctags

소스코드를 분석해 소스코드 심볼(함수, 변수, 클래스 등)을 수집하고, 이 정보들을 모아 위치를 기록해 인덱싱하여 tags파일을 생성한다.

이 유틸은 vi로 소스코드 분석을 매우 편리하게 해준다.

usage

 


ctags -R명령어를 프로젝트의 루트 디렉토리에서 실행해 tags 파일을 생성한다

 

 

 

vi로 tags파일을 열면 태그 / 파일 / 소스코드 정규식 순으로 프로젝트의 모든 심볼들이 저장되어있다.

여기서 tj(tags jmp) 명령어를 통해 원하는 함수명을 찾는다.

 

 

이 프로젝트의 모든 main 함수들이 나오고 점프하고싶은 main함수의 번호를 입력하면 위치로 간다.

 

 

코드를 분석하다가 점프하고 싶은 함수가 있으면 커서를 해당함수명으로 위치하고, ctrl + ] 를 입력하면 점프한다.

 

 

main함수에서 av_packet_alloc함수로 넘어왔는데 이전 위치로 가고싶으면 ctrl + t 를 입력하면 된다.

위 내용은 tags 파일을 직접 열어서 분석하는 방법이고 특정 파일에서 함수 원형을 찾고싶을때는 마찬가지로 프로젝트 루트 디렉토리에서 tags파일을 생성하고, ~/.vimrc파일에 아래와 같이 추가해주면 해당 경로의 tags 파일을 참조해 분석 가능하다.

 

[리버스 프록시 서버로 사용하기]

  • 준비물 : 리버스 프록시 서버 1대, 웹 서버 2대

먼저 리버스 프록시서버로 사용 할 서버 1대(www.tmdahr1245.com)에 nginx를 설치해주고,

웹서버는 외부에서 접근하지 못하도록 사설IP 192.168.152.129를 사용하는 서버에 3000번과 4000번으로 각각 웹서버를 열었다.

/etc/nginx/nginx.conf 파일을 서버 상황에 맞게 적절히 세팅한다.

나는 include /etc/nginx/sites-enabled/*; 이부분을 주석처리 했다.

 

이후 nginx가 설치된 서버에 /etc/nginx/conf.d/web.conf 라는 파일을 생성하고 아래 설정값을 넣어준다.

/etc/nginx/conf.d/web.conf

위 설정값은 http://www.tmdahr1245.com/a 라는 URL로 요청이 들어오면 http://192.168.152.129:3000/a 로 request 패킷을 전송하겠다는 설정이다.

http://www.tmdahr1245.com/a의 엑세스로그에는 정상적으로 로깅이 되며,

request는 웹서버(192.168.152.129:3000, 192.168.152.129:4000)에서 처리하여 response를 다시 http://tmdahr1245.com/a 로 전달하고,

해당 리버스 프록시 서버에서 클라이언트에게 response를 준다.

 

tmdahr1245.com/a 접속
tmdahr1245.com의 엑세스 로그
192.168.152.129:3000의 엑세스 로그
tmdahr1245.com/b 접속
tmdahr1245.com의 엑세스 로그
192.168.152.129:4000의 엑세스 로그

 

 

[로드밸런서로 사용하기]

  • 준비물 : 로드밸런서용 서버 1대, 웹 서버 2대

로드밸런서 역할을 할 서버 1대(www.tmdahr1245.com)에 nginx를 설치해주고, 동일한 기능의 웹서버 2대를 준비한다.

 

이후 nginx가 설치된 서버에/etc/nginx/conf.d/web.conf라는 파일을 생성하고 아래 설정값을 넣어준다.

/etc/nginx/conf.d/web.conf

위 설정값은http://www.tmdahr1245.com/a라는 URL로 요청이 들어오면,

http://192.168.152.129:3000/a, http://192.168.152.129:4000/a로 request 패킷을 번갈아 전송하겠다는 설정이다.

 

tmdahr1245.com/a 접속
tmdahr1245.com의 엑세스 로그
192.168.152.129 웹서버 엑세스 로그

실제로 client는 계속 www.tmdahr1245.com/a에 접속을 하지만, www.tmdahr1245.com에서는 192.168.152.129의 3000번 포트 웹서버와 4000번 포트 웹서버로 번갈아 요청이 가는것을 확인할 수 있다.

로드밸런싱 알고리즘

  • 기본적인 로드밸런싱 알고리즘을 upstream 옵션을 통해 설정하고 이외에도 여러 옵션들이 있다.
로드밸런싱 알고리즘 설명 upstream 옵션
Round Robin request 순서대로 번갈아 처리 default
Weighted Round Robin

각각의 서버에 가중치를 정하고,

가중치대로 request를 처리

weight = n
IP Hash

client의 ip를 해싱하여 특정 client는

항상 동일한 서버로 연결

ip_hash;
Least Connection 요청이 들어온 시점에 가장 연결이 적은 서버로 연결 least_conn;

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream

'리눅스' 카테고리의 다른 글

Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04
How to kill a network session in Linux  (0) 2020.03.19
Remote control using SPICE protocol on the web  (0) 2019.11.27
How To Use apt-get  (0) 2016.10.17

 

3311포트를 통해 연결된 세션 중 특정 세션만 끊고 싶을때 

 

client 측 ip 및 포트

 

61395포트로 연결된 세션만 끊긴것 확인

 

[SPICE Protocol]

SPICE(Simple Protocol for Independent Computing Environments) 프로토콜은 가상머신 전용 원격 접근 프로토콜로 오픈소스이다.(https://www.spice-space.org/)
비슷한 종류의 프로토콜로는 RDP, VNC 등이 있다.
SPICE의 특징으로는 QEMU와 같이 동작하기 때문에 가상머신에 별도의 프로그램을 설치하지 않고 QEMU를 통해 가상머신을 실행시키면 원격 접속할 수 있다.
SPICE 프로토콜을 통해 클라이언트 원격 접속 프로그램으로  원격제어가 가능하며 웹 상에도 클라이언트 라이브러리가 존재하기 때문에 가상머신 제어가 가능하다.

[SPICE 프로토콜을 이용한 웹 상에서의 원격제어]

  • 실습 환경
    • Google Cloud Platform n1-standard-4(vCPU 4, RAM 15GB)
    • Ubuntu 18.04 Server
    • Node.js 8.10.0
 

kvm 설치

해당 명령어의 실행결과는 가상화 기능을 지원하는 CPU의 갯수를 출력해준다.
만약 0이 나온다면 가상화를 지원하는 CPU가 없으므로 가상머신의 성능이 떨어진다.
가상화를 지원하는 CPU인데 0이 나온다면 BIOS 설정에 들어가 가상화 확장 기능을 활성화 해준다.
 
이후 아래 명령들을 통해 kvm을 설치한다.
sudo apt-get install qemu-kvm libvirt-bin bridge-utils ubuntu-vm-builder
sudo apt-get install virt-manager
(virt-manager는 우분투 서버버전에서는 사용 불가능하니 서버버전을 사용중이라면 GUI를 설치한다.)
sudo apt-get install ubuntu-desktop
아래 명령어를 통해 아래와 같은 결과가 나온다면 성공적으로 kvm이 설치되었다.

kvm에 윈도우 설치(virt-manager사용)

sudo virt-manager
 

 

virt-manager를 통해 버츄얼박스에 윈도우 설치하듯 설치한다.

 

kvm-spice설치

 
sudo apt-get install qemu-kvm-spice
kvm-spice를 설치하고 가상머신을 동작시킨다.
아래 명령으로 가상머신을 동작시킨다.
sudo kvm-spice -enable-kvm -hda /var/lib/libvirt/images/win10.qcow2 -spice port=5900,disable-ticketing -m 8192 -net nic -net user -usb -device usb-tablet
 
명령에서 가상머신의 이미지 경로는 virt-manager에 IDE Disk1 탭에서 얻을 수 있고 포트는 5900으로 열어준다.
-m 옵션은 메모리 설정이다.
  • qcow2파일은 QEMU Copy On Write의 약자로 가상머신 디스크의 이미지 저장 형식이다. 
  • 버츄얼 박스, vmware의 vmdk파일과 같은 역할이라고 보면된다.
이후 ubuntu 기본 원격 프로그램 remote viewer를 통해 접속해본다.
 
 
가상머신에 원활히 접속된다면 kvm-spice를 통해 정상적으로 가상머신이 작동한다는 뜻이다.
 

Nginx 설치

sudo apt-get install nginx
 

Spice-html5 다운

nginx 기본 웹 루트인 /var/www/html에 https://gitlab.freedesktop.org/spice/spice-html5에서 클론을 받는다.

Websockify 실행

npm install node-websockify
위 명령을 통해 node-websockify패키지를 설치한다.
node-websockify는 웹소캣 트래픽을 일반 소캣 트래픽으로 전송해 준다고 나와있는데 그냥 포트포워딩 정도로 생각하고싶다.
위 코드를 실행시키면 서버에서는 websockify가 동작하고있다.
 

웹 접속

현재까지 kvm에 윈도우 설치이후 작동시키는것, websockify 실행, nginx 웹서버 구동이 끝났고 
이제 웹을 통해 접속하여 가상머신을 제어할 수 있다.
아래 host와 port 적어주는 부분이 있는데 공인 ip와 8080포트를 적어주면 websockify가 웹소켓 패킷을 일반 소켓 패킷으로 전송해주고 
5900포트로 전송되어 kvm-spice를 동작시킬 때 입력했던 5900포트로 연결되어 가상머신 화면을 받아온다.
 

virsh를 이용한 가상머신 관리 [참고]

가상머신 리스트 출력
virsh list --all 
가상머신 켜기(추천하지 않는다.)
virsh start 가상머신이름(virt-manager기준)
  • Windows10기준 qemu-system-x86_64를 통해 켤때 부팅속도가 30초이상 차이났다.
가상머신 스냅샷 찍기
virsh snapshot-create-as --domain 가상머신이름(virt-manager기준) --name “스냅샷명"
가상머신 스냅샷 돌리기
virsh snapshot-revert 가상머신이름(virt-manager기준) 스냅샷명
 

apt(advanced packaging tool)는 리눅스에서 소프트웨어를 설치하고 제거할때 사용하는 소프트웨어이다.


사용법 : apt-get [option] command package



* command


   -    update : 새 패키지 목록 가져오기

   -    upgrade : 업그레이드 실행

   -    install : 새 피키지 설치 (패키지 이름은 확장자를 제외함)

   -    remove : 패키지 제거

   -    autoremove : 사용하지 않는 모든 패키지를 자동으로 제거

   -    purge : 패키지와 설정 파일을 함께 제거

   -    source : 소스 압축 파일 다운로드

   -    build-dep : 소스 패키지의 빌드 의존성 설정

   -    dist-upgrade : 배포판 업그레이드, apt-get(8) 페이지 확인

   -    dselect-upgrade : dselect 선택 따르기

   -    clean : 다운로드한 압축 파일 지우기

   -    autoclean : 다운로드한 압축 파일 중 오래된 것 지우기

   -    check : 의존성이 깨진 패키지를 확인

   -    changelog : 주어진 패키지의 바뀐 내용 목록을 다운로드한 후 표시

   -    download : 현재 디렉터리로 바이너리 패키지 다운로드



* option


   -h  이 도움말.

   -q  기록할 수 있는 출력 - 작업 알리미 없음

   -qq 올 이외의 메시지 표시하지 않기

   -d  압축 파일을 설치하거나 압축 해제하지 않고 다운로드만 하기

   -s  동작 없음. 명령 시뮬레이션 실행

   -y  모든 질문을 표시하지 않고 예라고 대답하기

   -m  압축 파일을 찾을 수 없어도 계속 진행

   -u  업그레이드한 패키지의 목록도 표시

   -b  소스 패키지를 가져온 후 빌드

   -V  자세한 버전 번호 표시




패키지 소스 리스트 갱신(upgrade 를 하기 전에 update 해서 /etc/apt/source.list 를 갱신)

sudo apt-get update



설치된 패키지 업그레이드

sudo apt-get upgrade



패키지 설치

sudo apt-get install 패키지명



패키지 제거

sudo apt-get remove 패키지명



패키지 재설치(소프트웨어가 잘못되어 있을 때 사용)

sudo apt-get reinstall 패키지명



apt-get install 명령어로 설치한 패키지(deb) 파일의 삭제

sudo apt-get clean


* 경로(/var/cache/apt/archives)에 .deb 패키지 파일로 저장되어 있다.



패키지 검색

apt-cache search 패키지명



패키지 정보보기

apt-cache show 패키지명

+ Recent posts