김보안의 블로깅
  • 🏠 Home
  • 📚 Project
    • Blockchain
      • 🎦 PickMe
      • 🎦 IoTC
      • 🎦 Blackchain
      • 📃 Gemology
      • 🎦 PickMe
      • 🎦 PickMe
    • AI
      • 👋 A.I. Dream Reader
      • 🎦 A.I. Dream Reader
    • Security
      • 🎦 SNAC
    • Education
      • 🎦 Smart Lecture
  • 🤸‍♂ Hobby
    • Music
      • Violin
      • Guitar
      • Piano
      • Drum
    • Flower
      • Flower Certificate
    • Sport
      • Ski
      • Skateboard
      • Golf
      • Boxing

2013년 12월 16일 월요일

[JMeter] JMeter로 웹소켓 테스트 하기

 SecureKim     오전 12:47     웹소켓 테스트, JMeter, jmeter 웹소켓, jmeter 웹소켓 테스트, Node.js, test, Websocket     10 comments   



검색결과 국내에 JMeter-웹소켓 테스트 정리한 자료가 없어서

정리해 봅니다.


이 포스팅에서는

가장 보편적으로 쓰이는 로그인으로 예를들어 테스트를 해보겠습니다.


1. JMeter는 다음 페이지에서 다운 받을 수 있습니다.
http://jmeter.apache.org/download_jmeter.cgi


2. JMeter Websocket 
Kawasima 씨가 만드신 JMeter 플러그인을 다운 받습니다.
https://github.com/kawasima/jmeter-websocket

또는 소스코드 빌드가 귀찮으신 분은 Jar파일을 직접 다운 받으시면 됩니다.
-maven 3.0 으로 빌드되었습니다.
https://dl.dropboxusercontent.com/u/89045969/jmeter/ApacheJmeter_websocket-0.1.0-SNAPSHOT.jar
-With Dependencies
https://dl.dropboxusercontent.com/u/89045969/jmeter/ApacheJmeter_websocket-dist-0.1.0-SNAPSHOT.jar


3. 다운받은 jar파일을 \apache-jmeter\lib\ext 에 
집어넣은 후, JMeter를 실행.


4. Thread Group 을 생성합니다.















생성한 Thread Group을 선택하면
Number of Threads (몇개의 Thread를 만들 것인지.)
Ramp-Up Period (Thread 당 생성 시간)
Loop Count (하나의 Thread가 해당작업을 몇 번 수행 할 것인지.)
항목이 있습니다.

예를들어,
Number of Threads를 100
Ramp-Up Period를 100
Loop Count를 100
으로 설정해서 돌리면 Thread가 초당 하나씩 100개 까지 생성되면서
각각 작업을 100번씩 수행하겠죠? 그럼 10000번 수행하게 됩니다.

그럼 Ramp-Up Period를 0으로 설정하면?
100개의 Thread가 0초 즉 동시에 생성되어 작업을 수행합니다.
이것도 10000번 수행하게 됩니다.
즉 Ramp-Up Period를 작게 설정하면 Throughput이 더 나올 거고
테스트에 걸리는 시간이 더 단축될겁니다. 서버에는 부하가 더 가해지겠죠.


5. 웹 소켓 샘플러를 생성합니다.



6. CSV Data Set Config 생성
먼저 설명을 좀 드리면 제 웹소켓 서비스 제공 서버는 Node.js 입니다.
받은 요청을 '/' 로 스플릿 하여 어떤 서버측 함수를 호출 했는지 구별하고,
서버측 내부 함수(reqLogin)에 파라미터로 '/' 이후 부분을 넘겨주는 식입니다.


다양한 값을 테스트해보기 위해 데이터 셋을 만듭니다.
물론 Send message 부분에 직접 값을 박아서 해도 됩니다.
${ID} 와 ${PW} 부분에 실제 데이터를 집어넣으시면 되는거죠.














(잘 안보이시는분, Send message 에
reqLogin/{"ID":"${ID}","PW":"${PW}"} 라고 적혀있습니다.)


자 이제 CSV Data Set Config를 생성합니다.




생성한 CSV Data Set Config 를 눌러서
Filename 부분에는 csv 파일경로(txt파일도 가능합니다.)
Variable Names(comma-delimited) 에는 ID,PW 라고 적습니다.

csv 파일은 이런식으로 구성 하면 됩니다.



테스트를 실행하면 id1,pw1 로 로그인을 시도하기 시작하는데요

일단 잠깐..


5. View Results Tree를 생성합니다.

테스트 후 결과를 보기위한 리스너를 달아줍시다.




View Results Tree를 생성해 요청 및 반환값을 확인합니다.

단, 여기에는 중요한 이슈가 있습니다.
많은 Thread Group을 돌릴 경우에, View Results Tree 때문에
느려지는 현상이 있습니다. 심하면 에러율이 100%까지 올라가며 JMeter가 멈춥니다.
이걸 몰라서 고생을 좀 했네요.


7. Summary Report 생성
Thread Group들의 테스트 결과를 보기위해 요약 리포트를 생성합니다.
쉽게 에러율과 Throughput 등을 확인 할 수 있습니다.




8. 시작, 비우고 시작
재시작 하실땐 비우고 하셔야 테스트가 제대로 됩니다.
검정색이 시작, 붉은색이 비우는겁니다.



9. 테스트 결과















Number of Threads를 100

Ramp-Up Period를 1
Loop Count를 100

으로 테스트 한 결과입니다.

(Constant Throughput Timer를 단 후 20만 정도의 적당한 값을 설정하면
더 높은 Through put 이 나오기도 합니다.)

Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

2013년 12월 15일 일요일

[Node.js] Mysql - ReleaseConnection 에러

 SecureKim     오후 11:28     릴리즈커넥션, 에러, Cannot call method 'ReleaseConnection' of null, error, mysql, Node.js, ReleaseConnection     No comments   

Cannot call method 'ReleaseConnection' of null

참조 페이지
https://github.com/dougwilson/node-mysql/commit/ef13ca08dfc8025a93c607656119b7abb3b3b2aa
// Release Connection시 에러가 날 때가 있는데요.
// 해결 방법입니다.


//  lib/PoolConnection.js 수정하기

PoolConnection.prototype.release = function () {
  if (!this._pool || this._pool._closed) {
      return;
    }
  return this._pool.releaseConnection(this);
};


//  test/integration/pool/test-destroy-connection.js 수정하기

var common     = require('../../common');
var assert     = require('assert');
var Connection = require(common.lib + '/Connection');
var pool       = common.createPool();

pool.getConnection(function(err, connection) {
  if (err) throw err;
  assert.strictEqual(connection, pool._allConnections[0]);
  connection.destroy();

  assert.ok(pool._allConnections.length == 0);
  assert.ok(!connection._pool);

  assert.doesNotThrow(function () { connection.release(); });
  
  pool.end();
});






Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

2013년 12월 7일 토요일

[MySQL] Query with `Join` and `If`

 SecureKim     오전 5:31     조건문, 조인, if, join, mysql, where, where 조건     No comments   


다음에 보면 더 간단하게 짤 수 있지 않을까라는 생각이 들어 메모합니다.


테이블을 잠깐 설명하면


어떤 ID가 계획(부모)을 만들고 나면
다른 ID는 부모 계획을 가리키는 동일한 계획(자식)을 만들 수 있습니다.
자식계획을 만들었다고 해서 반드시 계획에 참여 하는 것은 아닙니다.
(부모 계획에 불참 가능)


(부모 자식이라는건 개념 이해를 돕기 위한것입니다.)


 User 테이블, Plan 테이블이 있고,

User 테이블에는
 `ID`와 `NM`(이름) 컬럼이 있습니다.

Plan 테이블에는 
 Primary키인 `index` 컬럼
 Unique키인 (`ID`,`code`) 컬럼
 index 컬럼을 참조하는 `plan` 컬럼
 참여를 뜻하는 일반 컬럼 `go` 가 있습니다. 


예를들어
index가 11이고 code가 1111인 부모(plan=1) 계획에 kim은 참여(go=1) 합니다.
index가 12이고 code가 1111인 자식(plan=11) 계획에 ston는 참여(go=1) 합니다.
index가 13이고 code가 1111인 자식(plan=11) 계획에 john는 불참(go=0) 합니다. 
ㅡㅡㅡㅡㅡㅡㅡㅡ
index가 20이고 code가 1111인 부모(plan=1) 계획에 poul은 참여(go=1) 합니다.
index가 21이고 code가 1111인 자식(plan=20) 계획에 nice는 참여(go=1) 합니다.


위 예제에서 index 11번이 삭제될 경우
index 12,13번도 같이 삭제시키고 Index 20 ,21 번은 삭제 안되게 하려면?
외래키 plan에 대해 Cascade로 설정하면 되겠네요.


진짜 문제는 다음과 같습니다.

클라이언트에서
kim과 1111을 가지고 쿼리했을 때
ston과 1111을 가지고 쿼리했을 때
john과 1111을 가지고 쿼리했을 때 

동일하게 이 계획에 참여하는 kim, ston의 이름을
출력해야 합니다.
(코드만 같고 다른 계획에 속한 poul,nice의 이름이나
계획은 있지만 불참하는 john의 이름은 출력하면 안됨)


다시말해
poul과 1111을 가지고 쿼리했을 때
nice와 1111을 가지고 쿼리했을 때

동일하게 poul과 nice의 이름이 출력 되어야 겠죠.






쿼리를 다음처럼 구성해보았고 결과는 잘 나오는데요
이게 과연 성능상 좋은 쿼리인지는 잘 모르겠네요.

SELECT NM
FROM Plan join `User` on `Plan`.ID=`User`.ID
WHERE ((plan=if(
(SELECT plan FROM Plan WHERE ID=? and code=?)=1,
(SELECT `index` FROM Plan WHERE ID=? and code=? ),
(SELECT `plan` FROM Plan WHERE ID=? and code=?)))
or (`index`=if(
(SELECT `plan` FROM Plan WHERE ID=? and code=?)=1,
(SELECT `index` FROM Plan WHERE ID=? and code=? ),
(SELECT `plan` FROM Plan WHERE ID=? and code=?))))
and go=1

짤땐 힘들었는데 짠다음 줄바꿈을 하고 보니 간단하네요.

쿼리를 설명하면


FROM 절 :
이름을 얻기위해 Plan과 User 테이블을 조인하는거구요


Where 절 :
1. 부모인 경우
ID와 code 로 쿼리했을 때 `plan`값이 1이겠죠.(부모) 그래서
부모의 `index`값으로 `plan`을 쿼리해 자식 계획들을 찾습니다.
근데 이러면 여기에 자식들만 포함되고 자기 자신은 포함 되지 않았죠?
그래서 or 이후 에서
plan이 1인경우 자기자신을 포함하는겁니다.

2.자식인 경우
ID와 code 로 쿼리했을 때 `plan`값이 1이 아니겠죠(자식)
그럼 자기자신을 포함한 자식들을 찾습니다.
`plan`값을 통해서요.
근데 부모가 포함되지 않았죠?
그래서 or 이후에서 1이 아닌 경우 자신의 `plan` 값으로
자신의 부모 `index` 를 찾습니다.



Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

2013년 11월 21일 목요일

[Ucrew] Ativ Tab 3 사용 후기

 SecureKim     오후 6:11     Ucrew, windows     2 comments   



저는 정말 다양한 곳에서 이 기기를 사용하고 있는데요.

추천해드리고 싶어 포스팅 합니다.



학교

예전에는 항상 모든 PPT를 다 출력해서 필기했었는데

저희 과는 모든 과목이 PPT나 PDF를 이용하기 때문에

때문에 종이 낭비가 굉장히 심했었어요.

(A4 한통 산거 한 학기에 다쓰고도 모자람...)










하지만 이젠

이렇게 강의중에 Ativ Tab 3를 켜고

PPT를 띄워서 그대로 필기를 할 수 있습니다.





















 S 노트 앱을 켜면 이렇게 필기도 되고 음성 메모라고 해서

교수님이 말씀하고 계신것을 녹음도 할 수 있어요 !

사실 이 기능은 있는지 잘 몰랐었는데

앞으로 유용하게 사용할 수 있을 것 같습니다.













동아리

저는 오케스트라 동아리에서 활동중인데요.

악보를 안가져 왔거나

새로운 곡을 한번 연주해보고 싶을때.

항상 악보를 뽑을 수는 없잖아요?










요렇게 악보를 바로 띄우면 됩니다!

얼마나 간편한지.

옛날 같았으면 이 추운날 다시 도서관 가서

악보를 프린트해와야 합니다.











전공

그리고 저는 소프트웨어 학과다 보니

코딩해야 할 일이 많습니다.









네 여긴 지하철인데요,

이렇게 가지고 다니면서

코딩도 할 수 있어

시간이 절약됩니다!

(Visual Studio 2012입니다.)










그래봤자 탭인데 뭐가 잘 되겠어? 라고 생각하시는 분들

보십시오.























자그마치 버츄얼머신이 돌아갑니다 !

왼쪽은 Putty로 오른쪽 리눅스에 터미널 접속을 하려고 하는 것이구요

오른쪽은 리눅스(Redhat)를 VirtualBox에서 띄운 화면입니다.



코딩도 되고 VM도 돌아가고 오피스도 되고 필기에 음성녹음...

성능이 좀 떨어지긴 하지만

여태 이거 없이 어떻게 살았나 싶을 정도로

이번학기에

저에게 있어서 정말 없어서는 안될 소중한 기기라고 생각합니다.

특히, 가벼우니까요.


강추.


Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

2013년 11월 18일 월요일

[Node.js] MySQL 커넥션이 빠르게 끊어질 때

 SecureKim     오전 12:14     끊어짐, connection, destroy, end, error, mysql, Node.js     2 comments   

Mysql Pool

이번에 사용 하는 클라우드 서버는
Mysql 설정 파일을 바꿔도 윗단에서 커넥션을 빠르게 끊어버리는 바람에 문제가 되었습니다.

맨 처음에는 setInterval와 end 함수의 콜백을 이용해 특정 시간이 될 때마다
커넥션을 모두 끊고 다시 연결을 만들도록 했었는데요.
그래도 어느 순간이 되면 커넥션 에러가 발생 했습니다.

다음 시도는 Mysql-simple-pool모듈을 사용 하는 것이었습니다.
저번에 Mysql-simple-pool에 관해 포스팅을 한 적이 있었죠.
그런데 사용시 전에는 없었던 문제가 생겼습니다. 그것은 쿼리를 처음 할 땐 에러가 난다는 것이었죠.
쿼리를 몇 번 하고 나서야 에러가 안나고 잘 처리 되었습니다.

여러가지 해결 방법을 찾아보다가 Mysql모듈도 Pool을 지원한다는 사실을 알게 되었습니다.


var mysql = require('mysql');

var mysqlConfig = {
  host:       "아이피",
  port:       "포트",
  user:       "아이디",
  password:   "암호",
  database:   "데이터베이스" 
  };

var pool= mysql.createPool(mysqlConfig);

    pool.getConnection(function(err,connection){
        connection.query("쿼리",function(err,rows){
        //rows를 처리할 내용
        //release를 해주어 커넥션이 pool로 되돌아 갈 수 있도록 해줍니다.
        connection.release();
        //이제 이 커넥션은 pool로 돌아가 다른 주체가 사용 할 수 있도록 준비합니다.
        });
    });

//추가사항 : 이렇게 해줘도 끊기는 현상이 발생 할 때가 있었습니다.
//이건 최후의 방법인데 특정 시간마다 연결했다 끊는겁니다.
//저는 결국 이 방법으로 해결했습니다.

function keepAlive(){
   pool.getConnection(function(err, connection){
     if(err) { return; }
     connection.ping();
     connection.release();
   });

    //redis client를 사용중이라면, 아마 Redis연결도 빠르게 끊길겁니다.
    //client.ping();  // 라고 해주면 Redis연결도 유지합니다.
 }
 setInterval(keepAlive, 60*1000);







Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

2013년 11월 14일 목요일

[Node.js] Android-client not handshaken client should reconnect

 SecureKim     오전 1:08     android, client not handshaken client should reconnect, JAVA, Node.js     5 comments   

Socket.io



이 문제가 또 저를 붙잡았습니다.

예전에 자바스크립트로 코딩할 때, 알 수 없는 이유로 클라이언트 측에서

엄청나게 많은 reconnect를 요구하는 바람에 노드 서버가 아무것도 못하고

뻗어버리는 현상이 있었는데요

그때는 자바스크립트 측에 강제로 횟수 제한을 두어서 계속 연결 시도를 못하게 했었습니다.

이번에는 클라이언트가 자바인 경우인데요.

많은 Reconnect를 요구하는 것이 아니라 제대로 연결이 안됩니다.

게다가 될때도 있고 안될때도 있어서 매우 혼란스러운 상황이었습니다.

일단 로그는 다음과 같습니다.

서버측 : client not handshaken client should reconnect
클라이언트측 : IOCallback() 의 onError 작동

해결은 다음과 같이 했습니다.
// 사용 : https://github.com/Gottox/socket.io-java-client

static public int socketCnt=0; // 사용될 전역변수입니다.
static Thread tRecv;

public static void initialize(){
    tRecv = new Thread() {
    public void run() {
    try {
     socket = new SocketIO("http://***:***/");
     IOCallback IOC=new IOCallback() {
      @Override
      ...

      @Override
       public void onError(SocketIOException socketIOException) {
         System.out.println("an Error occured");
                   //그러니까 요지는, 에러가 나면 다시 연결을 시도 한다는 겁니다.
                   //횟수 제한을 두도록 했습니다.
         try {
  if(socketCnt<10){
  socket = new SocketIO("http://***:***/");
  socket.connect(this);
  socketCnt++;
  }
 } catch (MalformedURLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 socketIOException.printStackTrace();
 }
     @Override
     ...
     socket.connect(IOC);
 } catch (Exception e1) {
 // TODO Auto-generated catch block
 e1.printStackTrace();
 }
     }
            
   };
   tRecv.start();
 try {
 tRecv.join();
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
}
일단은 해결 된 듯 보이지만 시간이 지나봐야 알 것 같네요ㅋㅋ
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
최근 게시물 이전 게시물 홈

페이지

  • 홈
  • Hobby

Categories

  • AI
  • AWS
  • Blockchain
  • Hardware
  • Javascript
  • Node.js
  • Plasma
  • Security
  • Study
  • Video
  • android
  • mysql
  • review
  • windows

Popular Posts

  • 블랙보드 강의 녹화 영상 다운로드 가능한 방법 (노설치)
    별도의 설치도 필요 없고 아주 쉽습니다. 구글 크롬브라우저 에서 블랙보드 녹화 영상에  다운로드 가능한 메뉴가 나오게 하는 코드입니다.  먼저 블랙보드 강의자료에 입장하고, 재생 버튼을 클릭 하지 않은 상태로 F12 를 입력합니다. 재생을 클릭하지 마...
  • 회사 프록시와 인증서에 고통받는 그대를 위한 글 (Bash, Gradle, Python, wget, nodejs(npm), apt-get, cURL, git, yarn, androidStudio)
    대기업에 입사하면 장단점이 있는데, 단점 중에 하나가 회사에서 프록시를 사용하여 트래픽 감시를 하므로 프록시 설정을 해주어야 한다는 점 입니다. 특히, 회사에서는 https 트래픽도 감시를 하므로 인증서도 설정해 주어야 합니다. 그런데 문...
  • Termux 로 안드로이드에 우분투(GUI)와 VSCode설치하기
      많은 글들이 있지만 뭔가 대부분 잘 안됐다. 이번 기회에 정리한다. 0. 먼저 Termux와 Remote Desktop Manager를 설치한다. Remote Desktop Manager 대신 아래도 나쁘지 않다. 화면이 작지만 마우스 스크롤이나 ...

Blog Archive

  • ▼  2026 (2)
    • ▼  2월 (2)
      • 태블릿에서 양자내성암호(격자암호) 돌려보기
      • 양자컴퓨터와 보안 위협 (쇼어 알고리즘)
  • ►  2025 (3)
    • ►  9월 (1)
    • ►  8월 (1)
    • ►  7월 (1)
  • ►  2024 (2)
    • ►  11월 (2)
  • ►  2023 (2)
    • ►  10월 (1)
    • ►  1월 (1)
  • ►  2022 (10)
    • ►  12월 (1)
    • ►  11월 (3)
    • ►  9월 (1)
    • ►  8월 (1)
    • ►  6월 (2)
    • ►  3월 (2)
  • ►  2021 (9)
    • ►  12월 (3)
    • ►  11월 (1)
    • ►  6월 (1)
    • ►  5월 (2)
    • ►  4월 (2)
  • ►  2020 (12)
    • ►  10월 (1)
    • ►  9월 (2)
    • ►  7월 (1)
    • ►  6월 (1)
    • ►  5월 (5)
    • ►  4월 (1)
    • ►  2월 (1)
  • ►  2019 (14)
    • ►  10월 (2)
    • ►  7월 (1)
    • ►  3월 (4)
    • ►  2월 (2)
    • ►  1월 (5)
  • ►  2018 (14)
    • ►  12월 (2)
    • ►  11월 (4)
    • ►  10월 (1)
    • ►  8월 (2)
    • ►  5월 (4)
    • ►  1월 (1)
  • ►  2017 (12)
    • ►  10월 (2)
    • ►  9월 (9)
    • ►  5월 (1)
  • ►  2016 (8)
    • ►  10월 (2)
    • ►  8월 (1)
    • ►  6월 (1)
    • ►  1월 (4)
  • ►  2015 (6)
    • ►  12월 (3)
    • ►  10월 (1)
    • ►  6월 (1)
    • ►  5월 (1)
  • ►  2014 (10)
    • ►  11월 (1)
    • ►  9월 (1)
    • ►  7월 (1)
    • ►  6월 (1)
    • ►  5월 (3)
    • ►  4월 (1)
    • ►  3월 (2)
  • ►  2013 (28)
    • ►  12월 (3)
    • ►  11월 (6)
    • ►  10월 (6)
    • ►  9월 (6)
    • ►  8월 (1)
    • ►  7월 (3)
    • ►  6월 (3)

구독

글
Atom
글
전체 댓글
Atom
전체 댓글

로드 중입니다...

각오

직접 해보지 않은 것은 포스팅 하지 않겠습니다.

Copyright © 김보안의 블로깅 | Powered by Blogger
Design by Hardeep Asrani | Blogger Theme by NewBloggerThemes.com | Distributed By Gooyaabi Templates