Tag Archives: Limit

[RHEL] Ethernet Bandwidth Limit 걸기 (속도 제한/QOS)

2010년 2월 4일 추가 —-
이 기능은 잘 되지 않는것으로 판단됩니다. 자세한 부분은 댓글을 참고하세요.


리눅스의 사실상 기본 패키지인 iproute안에는 tc(Traffic Control)이라는 명령어가 포함되어 있습니다.

이 명령어를 사용하여 네트워크 스위치의 도움 없이도 자체적으로 자신의 이더넷 속도를 제한 할 수 있습니다.

이는 보통 네트워크에서 말하는 QOS(Quality Of Service)와 비슷한 기능을 제공합니다.

하지만 저비용으로 고효율을 낼 수 있다는 점에서 매우 괜찮은 방법인듯 합니다.

1) 요구 사항
– iproute RPM 패키지가 설치되어있어야 함
– 리눅스 커널의 iproute 파트의 Traffic Control 옵션(Netlink포함)이 활성화 되어있어야 함.
– 리눅스 커널 2.4버젼 이후의 경우 기본적으로 대부분의 Traffic Control 옵션이 활성화 되어있음.

2) 시스템 명령어 추가
– shaping이라는 명령을 추가합니다.
[code]$ vi /etc/init.d/shaping[/code]
– 다음의 소스코드를 입력합니다.
[code]#!/bin/bash
#  tc uses the following units when passed as a parameter.
#  kbps: Kilobytes per second
#  mbps: Megabytes per second
#  kbit: Kilobits per second
#  mbit: Megabits per second
#  bps: Bytes per second
#       Amounts of data can be specified in:
#       kb or k: Kilobytes
#       mb or m: Megabytes
#       mbit: Megabits
#       kbit: Kilobits
#  To get the byte figure from bits, divide the number by 8 bit
#
 
# tc명령어의 위치를 입력합니다.
TC=/sbin/tc
 
# 대역폭을 제한하기 위한 이더넷 인터페이스를 지정합니다.
IF=eth0
 
# 다운로드 속도 제한
DNLD=15mbit
 
# 업로드 속도 제한
UPLD=15mbit
 
# 속도 제한을 적용할 호스트의 IP 주소
IP=123.123.123.123
 
# Filter options for limiting the intended interface.
U32=”$TC filter add dev $IF protocol ip parent 1:0 prio 1 u32″
 
start() {
# We’ll use Hierarchical Token Bucket (HTB) to shape bandwidth.
# For detailed configuration options, please consult Linux man
# page.
    $TC qdisc add dev $IF root handle 1: htb default 30
    $TC class add dev $IF parent 1: classid 1:1 htb rate $DNLD
    $TC class add dev $IF parent 1: classid 1:2 htb rate $UPLD
    $U32 match ip dst $IP/32 flowid 1:1
    $U32 match ip src $IP/32 flowid 1:2
# The first line creates the root qdisc, and the next two lines
# create two child qdisc that are to be used to shape download
# and upload bandwidth.
#
# The 4th and 5th line creates the filter to match the interface.
# The ‘dst’ IP address is used to limit download speed, and the
# ‘src’ IP address is used to limit upload speed.
}
 
stop() {
# Stop the bandwidth shaping.
    $TC qdisc del dev $IF root
}
 
restart() {
# Self-explanatory.
    stop
    sleep 1
    start
}
 
show() {
# Display status of traffic control status.
    $TC -s qdisc ls dev $IF
}
 
case “$1” in
  start)
    echo -n “Starting bandwidth shaping: “
    start
    echo “done”
    ;;
  stop)
    echo -n “Stopping bandwidth shaping: “
    stop
    echo “done”
    ;;
  restart)
    echo -n “Restarting bandwidth shaping: “
    restart
    echo “done”
    ;;
  show)
    echo “Bandwidth shaping status for $IF:”
    show
    echo “”
    ;;
  *)
    pwd=$(pwd)
    echo “Usage: tc.bash {start|stop|restart|show}”
    ;;
esac
 
exit 0[/code]
– 실행 권한을 주고 실행해 봅니다.
[code]$ chmod 755 /etc/init.d/shaping
$ /etc/init.d/shaping start[/code]
3) 결과 확인
사용자 삽입 이미지

– 빨간선을 기준으로 왼쪽이 기존의 상황이고 오른쪽이 트래픽 제한을 한 이후 입니다.
– 기존의 경우 엄청나게 들쭉 날쭉한 것을 알 수 있습니다.
– 오른쪽의 경우 강제로 제한이 걸리면서 둥글게 트래픽이 뭉개지는 것을 볼 수 있습니다.
– 제한을 건 속도에 정확하게 제한이 걸리는것으로 보이지는 않습니다.
– 테스트를 거치면서 IDC상황에 맞게 설정하시면 될것 같습니다.

참고 : http://www.topwebhosts.org/tools/traffic-control.php

[MySQL] MySQL LIMIT의 속도 저하 피하기

MySQL을 사용하다 보면 무분별하게 나도 모르게 무분별하게 LIMIT를 사용하는것을 볼 수 있다.

다른 개발자분들은 어떠신지 잘 모르겠지만, 대용량 데이터베이스에서는 LIMIT만큼은 절대로 피해야 한다.

실제로 예전에 10억개의 데이터를 가공하는데 LIMIT를 쓰니 쿼리 하나가 몇일이 걸리는 사태가 발생하곤 했다.

사용자 삽입 이미지
간단하게 테스트 테이블을 만들어서 테스트 해보자. 데이터는 2천만개가 들어있다. 천만개째부터 5만개를 가져오는 쿼리이다.
11.216초 걸렸다.

사용자 삽입 이미지
EXPLAIN을 찍어보니 인덱스를 타지 않는것을 알 수 있다. 인덱스만 타도 좋을텐데…

사용자 삽입 이미지
위와 같이 쿼리를 바꿔보았다. 0.031초 걸렸다. 위와 같이 바꾸었을때 단점은 게시판처럼 동적으로 글이 늘어나는경우 IDX값을 정의하기 어렵다. 하지만 게시판 같은 경우에는 글쓴시각등으로 처리하는 방법등이 존재한다. 잘 고민하여 설계해 보자.

사용자 삽입 이미지
EXPLAIN을 찍어보니 인덱스를 타는것을 알 수 있다. 인덱스를 타고 천만번째로 바로 이동한 다음에 5만개를 가져올것이다.