반응형

원본

http://zetawiki.com/wiki/MySQL_%EC%8A%AC%EB%A1%9C%EC%9A%B0_%EC%BF%BC%EB%A6%AC_%EB%A1%9C%EA%B7%B8_%EC%84%A4%EC%A0%95

 

MySQL 슬로우 쿼리 로그 설정


MySQL long query, slow query log
MySQL 슬로우 쿼리 로그 설정
MySQL 느린 쿼리 로그 설정
MySQL 오래 걸리는 쿼리, 롱 쿼리 로그

확인

  • MySQL 접속하여 현재 설정 확인
mysql> SHOW VARIABLES LIKE 'slow_query_%';
+---------------------+---------------------------------+
| Variable_name       | Value                           |
+---------------------+---------------------------------+
| slow_query_log      | OFF                             |
| slow_query_log_file | /var/run/mysqld/mysqld-slow.log |
+---------------------+---------------------------------+
2 rows in set (0.00 sec)
→ 슬로우 쿼리 설정 OFF

로그 폴더 생성, 퍼미션 조정

[root@zetawiki ~]# mkdir /var/log/mysql
[root@zetawiki ~]# chown mysql:mysql /var/log/mysql
[root@zetawiki ~]# ll /var/log/ | grep mysql
drwxr-xr-x 2 mysql mysql    4096 Aug  3 22:46 mysql
-rw-r----- 1 mysql mysql   53059 Jun 15 02:08 mysqld.log

로그 설정

  • my.cnf 파일 편집. [mysqld]의 아래 적당한 곳에 다음 내용 기입
[root@zetawiki ~]# vi /etc/my.cnf
[mysqld]
... (생략)
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=5
→ [mysqld] 아래에 3줄을 추가한다.
→ slow_query_log = 1(사용), 로그파일 위치는 /var/log/mysql/mysql-slow.log
→ 수행시간이 5초 넘는 쿼리를 수집

cnf 파일(예시) 확인

[root@zetawiki ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_allowed_packet=4M
default-storage-engine=InnoDB
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=5

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

MySQL 재시작 (설정 적용)

  • 재시작(restart) 대신 리로드(reload)만 해도 됨
  • 여기서는 그냥 재시작
[root@zetawiki ~]# service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

확인

  • 슬로우 로그 파일 생성 확인
[root@zetawiki ~]# cat /var/log/mysql/mysql-slow.log
/usr/libexec/mysqld, Version: 5.1.73-log (Source distribution). started with:
Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
  • MySQL 접속하여 환경변수 확인
mysql> SHOW VARIABLES LIKE 'slow_query_%';
+---------------------+-------------------------------+
| Variable_name       | Value                         |
+---------------------+-------------------------------+
| slow_query_log      | ON                            |
| slow_query_log_file | /var/log/mysql/mysql-slow.log |
+---------------------+-------------------------------+
2 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'long_query_%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 5.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

테스트

5초 이상 걸리는 쿼리를 실행하고 로그 파일을 확인해보자.

mysql> SELECT SLEEP(7);
+----------+
| SLEEP(7) |
+----------+
|        0 |
+----------+
1 row in set (7.00 sec)
[root@zetawiki ~]# cat /var/log/mysql/mysql-slow.log
/usr/libexec/mysqld, Version: 5.1.73-log (Source distribution). started with:
Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 160102 20:29:51
# User@Host: root[root] @ localhost []
# Query_time: 7.000300  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1451734191;
SELECT SLEEP(7);

 

반응형
LIST
반응형

쓰레드와 동기화, 그리고 교착상태에 대한 설명 ::
http://warmz.tistory.com/350


공유
아래와 같은 방식으로 run()에서 공유할 객체에 접근하는 것이 가능해진다. 

예) 쓰레드가 객체를 공유하게 되는 방식 1 - Runnable 인터페이스 상속

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.*;
 
class example {
    public static void main(String[] args) {
        RunnableImpl r = new RunnableImpl();
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
         
        t1.start();
        t2.start();
    }
}
 
class RunnableImpl implements Runnable {
    int iv = 0;
 
    @Override
    public void run() {
        int lv = 0;
        String name = Thread.currentThread().getName();
 
        while (lv < 3) {
            System.out.println(name + " Local Var:" + ++lv);
            System.out.println(name + " Instance Var:" + ++iv);
            System.out.println();
        }
    }
}

결과)
Thread-0 Local Var:1
Thread-0 Instance Var:1

Thread-0 Local Var:2
Thread-0 Instance Var:2

Thread-0 Local Var:3
Thread-0 Instance Var:3

Thread-1 Local Var:1
Thread-1 Instance Var:4

Thread-1 Local Var:2
Thread-1 Instance Var:5

Thread-1 Local Var:3
Thread-1 Instance Var:6


예) 쓰레드가 객체를 공유하게 되는 방식 2 - Thread 상속
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.util.*;
 
class example {
    public static void main(String[] args) {
        Data d = new Data();
        MyThread t1 = new MyThread(d);
        MyThread t2 = new MyThread(d);
         
        t1.start();
        t2.start();
    }
}
 
class Data {
    int iv =0;
}
 
class MyThread extends Thread{
     
    Data d;
     
    MyThread(Data d) {
        this.d = d;
    }
 
    @Override
    public void run() {
        int lv = 0;
 
        while (lv < 3) {
            System.out.println(getName() + " Local Var:" + ++lv);
            System.out.println(getName() + " Instance Var:" + ++d.iv);
            System.out.println();
        }
    }
}

결과) 
Thread-0 Local Var:1
Thread-0 Instance Var:1

Thread-0 Local Var:2
Thread-0 Instance Var:2

Thread-0 Local Var:3
Thread-0 Instance Var:3

Thread-1 Local Var:1
Thread-1 Instance Var:4

Thread-1 Local Var:2
Thread-1 Instance Var:5

Thread-1 Local Var:3
Thread-1 Instance Var:6

 
 
동기화(Synchronized) 
 - 공유 데이터에 lock을 걸어 작업중이던 쓰레드가 마칠때까지 다른 쓰레드에게 제어권이 넘어가지않게 보호한다.
 - synchronized 블럭이 끝나면 lock이 풀리고 다른 쓰레드도 접근가능하게 된다.
 - 교착상태(dead-lock)에 빠질 위험이 있으므로 주의한다.

synchronized를 이용한 동기화 방법 
 - 가능하면 메서드에 synchronized를 사용하는 메서드 단위의 동기화를 권장
 
1
2
3
4
5
6
7
8
9
1. 특정한 객체에 lock을 걸고자 할 때
synchronized(객체의 참조변수){
    // ...
}
 
2. 메서드에 lock을 걸고자할 때
public synchronized void calcSum(){
    // ...
}
 

예) 동기화 적용 전 : if문을 통과하고 출금을 수행하려는 순간 다른 쓰레드에게 제어권이 넘어가서 다른 쓰레드가 출금을 해버렸고(잔고:0) 또 이전의 쓰레드로 제어권이 넘어오면서 출금을 수행했기 때문에 잔고가 음수가 되어버렸다.
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.*;
 
class example {
    public static void main(String[] args) {
        MyThread r = new MyThread();
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
         
        t1.start();
        t2.start();
    }
}
 
class Account{
    int balance = 1000;
     
    public void withDraw(int money){
        if(balance >= money){
            try{
                Thread.sleep(1000);
            }catch (Exception e) {}
            balance -= money;
        }
    }
}
 
class MyThread implements Runnable{
    Account acc = new Account();
     
    @Override
    public void run() {
        while(acc.balance > 0){
            // 100, 200, 300 중의 한 값을 임의로 선택해서 출금(withDraw)
            int money = (int)(Math.random() * 3 + 1) * 100;
            acc.withDraw(money);
            System.out.println("balance:" + acc.balance);
        }
    }
}

결과) 
balance:500
balance:500
balance:300
balance:0
balance:-300



예) 동기화 적용 후
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.*;
 
class example {
    public static void main(String[] args) {
        MyThread r = new MyThread();
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
         
        t1.start();
        t2.start();
    }
}
 
class Account{
    int balance = 1000;
     
    // 동기화 적용 (메서드 단위의 동기화를 추천한다.)
    public synchronized void withDraw(int money){
        /* 객체에 lock을 걸 경우
        synchronized (this) {
            여기에 소스 코드를 집어 넣어도 된다.
        }
        */
        if(balance >= money){
            try{
                Thread.sleep(1000);
            }catch (Exception e) {}
            balance -= money;
        }
    }
}
 
class MyThread implements Runnable{
    Account acc = new Account();
     
    @Override
    public void run() {
        while(acc.balance > 0){
            // 100, 200, 300 중의 한 값을 임의로 선택해서 출금(withDraw)
            int money = (int)(Math.random() * 3 + 1) * 100;
            acc.withDraw(money);
            System.out.println("balance:" + acc.balance);
        }
    }
}

결과)
balance:700
balance:500
balance:400
balance:200
balance:0
balance:0


반응형
LIST
반응형

안녕하세요.


기분좋고 깔끔한 철거 업체 하나 소개시켜 드립니다.


바로 수원에 있는 대진 철거.


공장철거, 상가철거 전문업체입니다.


철거로 고민중인 분들에게 많은 도움이 되었으면 좋겠네요~

 


반응형
LIST
반응형

우분투 버전이 11.10 버전 이상의 경우 apt 명령어로 바로 설치가 가능하다.


sudo apt-get install mosquitto


혹시 최신의 버전을 사용하고 싶을 경우에는 ppa를 추가한다.


sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa

sudo apt-get update


ppa를 추가하고 install 하게 되면 최신 버전의 mosquitto가 설치된다.



=======================

 2015.03.08 01:41

Mosquitto 란 MQTT 의 오픈소스로 간단히 말하면 메세지 서버 입니다.



간단히 개념을 짚고 넘어 가자면


Mosquitto_pub -> Mosquitto Broker -> Mosquitto_sub


Mosquitto_pub 는 Publish 로 발행자를 의미합니다. 메세지를 보내는 역할을 하고요.


Mosquitto Broker 는 중간에 메세지를 각 클라이언트한테 전달, 관리 하는 역할으르 합니다.


Mosquitto_sub 는 Subscribe 로 구독자, 메세지를 받는자를 뜻합니다. 각 토픽(채널)에 접속해서 다른 메세지를 받을수 있으며 기본적으로 아이디와 비밀번호의 적용이 가능합니다.


더욱 자세한 내용은 구글링을 추천 드립니다.


Ubuntu 에서의 설치 방법은 간단합니다.


우선 저장소 업데이트를 위해 아래의 명령어를 실행하여 주도록 합니다.


1
2
3
sudo apt-get install python-software-properties
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update


그리고 정상적으로 업데이트 되었는지 확인하여 봅니다.


1
sudo apt-cache search mosquitto




이제 mosquitto를 설치하시면됩니다.


1
sudo apt-get install mosquitto


설치가 모두 완료 되었다면 이제 실행해서 정상적으로 작동하는지 확인합니다.


1
mosquitto



기본적으로 1883 포트를 이용하며 설정 파일은 패키지 설치시 /etc/mosquitto/conf.d 에 *.conf 로 넣으시면 됩니다.


이제 다른 컴퓨터 혹은 다른 장비에서 클라이언트를 설치하고 접속을 확인해 보도록합니다.

*여기서는 VM 을 이용하여 테스트해보았습니다.


클라이언트는 위와 같은 방법으로 저장소 업데이트 까지 진행한 후 mosquitto 대신 mosquitto-client 를 설치합니다.

*클라이언트는 여러 종류가 있을 수 있습니다. 여기서는 간단하게 하기위해 mosquitto-client 를 이용할 뿐입니다.


1
sudo apt-get install mosquitto-clients


그리고 아래의 명령어로 위에서 실행한 서버에 접속을 시도 합니다.


1
mosquitto_sub -h 서버 주소 -t /토픽


위는 구독할때 그리고 아래는 메세지를 보낼때 사용하는 명령입니다.


1
mosquitto_pub - h 서버 주소 -t /토픽 -m "메세지"


토픽은 채널과 같은 역할을 하며 서버 주소는 말그대로 IP 혹은 도메인을 뜻합니다.

아래는 예제 결과 입니다.


-p 는 포트를 말합니다. 저 같은경우 기본 포트가 아닌 다른 포트를 이용하였기 때문에 넣어 주었습니다.




반응형
LIST

+ Recent posts