2021-09-30

0930 tomcat max thread 실험!

 

1. 톰캣 max thread를 1개로 제한하고 100개 클라이언트를 받도록 한경우.( 하나의 클라이언트 요청 약 2초) => 100초 이상걸렸음!! 당연하다. 하나의 톰캣스레드가 혼자 작업을 수행하고, 작업이 끝날때까지 블로킹이 일어난다. blocking이 일어나면 다른 스레드로 교체해줘야 되는데 교체할 스레드가 없다. ㅋㅋ



2. 100개 max thread 톰캣에게 약 2초걸리는 작업을 할당 -> 3초 조금 넘게 걸림. context 스위칭 하는 시간 이 걸려서?


3. Async한 서버로 만든경우:

2초 조금 넘게걸렸다!!!! (세상에) 똑같이 톰캣스레드는 1개인데!!! 대신 작업스레드가 늘어난다. 어떤기준인지는 몰겠으나. 이경우 8개의 워커스레드가 뒤에서 동작하였다. 아마 내가 지금 4코어 컴퓨터라서 4*2= 8 개 만든것인가??




요청을 1000개 로 늘렸더니. 서버는 작업 다 끝냈다고 하는데 클라이언트 쪽은 무한대기에 빠졌다?? 왜지?

2021-09-29

0929 CyclicBarrier 사용하기

 


1.CyclicBarrier 클래스

await()이 불린만큼 생성자안의 넘버가 한개씩 줄어들고.

넘버==0 이되면 메소드를 수행한다. 

2. 나의 경우

메인메서드에서 일단 한번 await() 걸어서. 얘 혼자 스택 못끝내게 만들어놓고.

100개의 스레드 다 만들어져서 await()이 총 101번 걸리면 그때 한꺼번에 호출!

그렇게 함으로써 total elapsed time을 구할 수 있도록 한다!


lock걸어서 동기화한다음에

await() 이 불릴때마다 카운트가 -1 씩 줄어들고

0이 되면 runnable 의 run()호출함을 확인할 수 있음. 


번외) AtomicInteger , AtomicLong클래스

Synchronized 키워드는 기본적으로 비관적 잠금이다. 

동기화 이슈는 확률적으로 매우 작게 일어나긴 하지만 , 일단 잠가놓고 본다.

그렇지만 Atomic~~클래스는 낙관적잠금을 한다.

일단 공유되어질수있고, 해당 공유되어진 값에 차이가 날경우 롤백?보완?잠금?하는 방식이라고한다. 따라서 성능면에서 더 좋다. 

아토믹하다, 원자적이라는 것은 더이상 쪼갤수없다는 것.

이를 테면 원자적 연산이란 = 더이상 쪼갤수없는 연산, 한번에 처리될 수 있는 연산을 의미한다. 

int a = 0은 원자적 연산이다.

하지만 a++ 은 원자적 연산이 아니다.

int a = 0 을 살펴보면

a 를 로드한다(4바이트) & 0을 로드한다(4바이트) & a에 0을 대입한다 => 컴퓨터가 원자적으로 처리할수있다.

하지만 a ++은어떨까?

a = a+ 1 이므로

더하는 과정에서 연산이 쪼개진다.(?) 

그리고 a가 int 가 아니라. long일경우에도! 8바이트가 되어서 연산이 쪼개진다고 함.

더 공부해야징~~


0929 톰캣 스레드 개수를 제한했을 경우

 

톰캣 max 스레드 개수를 10개로 제한


서버의 스레드가 10개로 제한되어 계속 돌려쓰기된다. 매우 느리게 된다!!



클라이언트 측에서는 스레드가 계속 만들어지는데. 서버측에서 이걸 못받아주니까 처리속도가 무지 느려진다! 

0929 inner class 재미있는 오류발생

 

해당 restController클래스에 static을 붙이지 않았을때 생기는 오류

Inner 클래스를 static 메인에서 참조하기 때문에 생긴다.

SpringbootRunner로 run()을 올리면. restController가 인스턴스로 뜨는 건가? 어떤식으로 참조하고 있는 거지. 

메인메서드 에서 static하게 클래스를 올려야 하는데

스태틱하지 않은 inner클래스가 있어서 에러.


해결방법 1) inner클래스를 바깥으로 빼낸다. public 키워드는 제외한다. 하나의 java파일안에 public 클래스는 단 하나밖에 있을수없으며 파일명과 동일해야 한다.


해결방법 2) static inner클래스로 만든다.

2021-09-28

0928 멀티스레드 테스트

 

약 1초 걸리는 thread를 10000개 만들어서 테스트.

톰캣의 max스레드 개수는 200개라고 알고있다.

확실히 200개까지 스레드가 만들어지고 그 이상은 안만들어진다. 계속 200개로 돌려쓰는 것을 알수있다. 


시간은 대략 3초 걸림. 생각보다 빠르네?!!

-----------------------------------
궁금해서 동기로 처리해봄 ㅎ

우선 클라이언트의 메인스레드가 sleep-working을 계속 반복하고 있음을 알수있다. io작업이 일어나는 동안의 blocking이 일어나는것이다.


서버 스레드의 경우 10개스레드로 돌린다. 
너무 못참겠어서 중간에 꺼버렸다. ㅎㅎ;;

2021-09-21

0921 head,tail, more,less

- head -숫자 [파일명]

위에서부터 몇줄 읽을것인지. 기본적으로는 10줄

- tail -숫자 [파일명]

아래에서부터 몇줄 읽을 것인지 출력. 기본적으로 마찬가지로 10줄

업데이트한 파일있을때 아래에 붙을것이니. tail쓰면 유용

- more, less

엔터를 누르면 한줄씩. 스페이스바를 누르면 한페이지 단위로 넘어간다. 문서양이 많을 때(cat으로는 너무 길어서 읽기힘든 파일) 을 읽을 때 유용.

- touch [파일명]

빈 파일을 만들때 사용. 이미 해당 파일명이 존재할 시 update시간을 해준다. 

0921 소켓 프로그래밍

 

알쏭달쏭...

서버: 인풋 아웃풋 스트림을 소켓으로부터 받아서 연다.

가지고 있는 해쉬맵(클라이언트 접속정보 저장) 에 모두에게 메시지를 보낸다.

클라이언트: 인풋으로 읽고 아웃풋으로 쓴다.

코드를 보면 ~~ 쉬운것같기도 하고~~~ 우아앙.

뭔가 확!! 풀리지가 . 않네~~ 




0328 fdisk, mkfs, mount, fstab

 1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다.  - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다.  - 마지막에 w를 해야 실제로 반영이 된다.  3. mkfs를 하여 어떤 파일시스...