-->

..:: seize the day ::..

February 14, 2008

Bandwidth Shaper di openSUSE

Filed under: IT stuff

 

Seorang rekan menanyakan kenapa mengkonfigurasi openSuSE koq susah sekali. Katanya untuk ngejalanin script sederhana membuat default route aja musti ngebuat script yang njlimet. He…he..he….
Dia bilang kalau di RedHat dan turunannya seperti Fedora dan Centos khan ada rc.local, terus kalau di openSUSE padanannya apa?

OK. Sebetulnya masalah ini sudah pernah saya bahas diblog saya yang dulu dan dibeberapa email saya tapi tak mengapa saya ulang lagi di sini dan saya tambahkan beberapa hal yang saya anggap relevan karena kebetulan ada juga yang nanya tentang load balancing trafik internet ke dua gateway dan implementasi htb (hierarchical tocken bucket) untuk traffic shaping.

Jadi saya akan menjelaskan implementasi load balancing, traffic shaping dan rc.local di openSuSE sekaligus, mumpung lagi ada kesempatan nulis.

LOAD BALANCING TRAFIK INTERNET

Di tempat saya koneksi internet terhubung ke dua ISP, LC 128 kbps ke ISP-A dan ADSL ke ISP-B. Singkat cerita saya menggunakan sebuah server dengan 3 ethernet card

eth0 ip address 202.158.xx.yyy netmask 255.255.255.240 gw 202.158.xx.yyy
eth1 ip address 10.0.50.5 netmask 255.255.255.248 gw 10.0.50.1
eth2 ip address 192.168.117.171 netmask 255.255.255.0 gw 192.168.117.171

Untuk load balancing trafik ini saya mengacu pada dokumen LARTC (Linux Advanced Routing & Traffic Control) How To yang disusun oleh Bert Hubert (thanks Om Bert) di http://lartc.org. Syarat untuk load balancing adalah sudah terinstallnya paket iproute2, yang sudah terinstall saat saya menginstall openSUSE 10.3.

Selanjutnya silakan mengacu ke tulisan saya di sini
     
Perlu diingat bahwa balancing disini tidak sempurna, karena route based, dan routes di-cache. Jadi route ke site yang sering dikunjungi akan selalu melaui provider yang sama. Contoh di server ini kalau saya traceroute www.detik.com akan selalu lewat ISP-A dan traceroute www.republika.co.id akan selalu melalui ISP-B.

TRAFFIC SHAPING

Tujuan traffic shaping di sini adalah (tentu saja anda bisa melakukan shaping dengan tujuan lain he..he…he..):
- menjaga low latency untuk interactive trafic, jangan sampai upload atau download mengganggu ssh.
- menjaga agar browsing berjalan pada reasonable speeds sementara melalukan up atau downloading.
- menjaga agar upload tidak mengganggu download dan sebaliknya.
- menandakan port atau host yang sering memakan traffic sebagai low priority.

Ada banyak sumber di intenet misalnya http://www.topwebhosts.org/tools/traffic-control.php dan favorit saya adalah sekali lagi om Bert di http://lartc.org/howto/lartc.cookbook.ultimate-tc.html. Jangan lupa baca pre-requisites untuk ngejalanin HTB dan pastikan kernel anda mendukungnya.
Mengapa tidak menggunakan fasilitas FW_HTB_TUNE_DEV yang tersedia di SuSEfirewall? Karena ternyata HTB_TUNE di SuSEfirewall tidak memadai untuk kasus saya, saya sudah mentestnya tetapi masih sering hang kalau trafficnya sudah mulai queuing.

Implementasi di tempat saya seperti di bawah ini. Setup ini saya dapatkan setelah berulang kali mencoba berbagai tipe queuing, CBQ, HTB, dan SFQ akhirnya saya mendapatkan setting yang sangat memuaskan. ADSL yang saya gunakan (Speedy Office) bisa dikatakan tidak pernah mati karena excessive upload yang membuat macet di sisi download. Saya hanya menset script di bawah untuk eth1 yang terhubung ke ADSL yang kecepatannya tidak simetris (dl = 1 mbps, ul = 128 kbps). Untuk eth0 saya tidak mensetnya karena kecepatannya simetris. Selain itu karena saya menset traffic dari LAN saya sebagian besar melewati ADSL.

        # script bandwidth shaping for SuSE 10.3 by medwinz@gmail.com
        # free to copy
        #

        echo -n "Starting NSI bandwidth shaping HTB qdiscs in eth1"

        DOWNLINK=968
        UPLINK=110

        # clean existing downlink and uplink qdiscs, hide errors
        tc qdisc del dev eth1 root    2> /dev/null > /dev/null
        sleep 2
        tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
        sleep 1

        # make qdisc
        tc qdisc add dev eth1 root handle 1: htb default 15
        tc class add dev eth1 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
        tc class add dev eth1 parent 1:1 classid 1:10 htb rate 36kbit ceil 36kbit prio 0
        tc class add dev eth1 parent 1:1 classid 1:11 htb rate 36kbit ceil ${UPLINK}kbit prio 1
        tc class add dev eth1 parent 1:1 classid 1:12 htb rate 9kbit ceil ${UPLINK}kbit prio 2
        tc class add dev eth1 parent 1:1 classid 1:13 htb rate 9kbit ceil ${UPLINK}kbit prio 2
        tc class add dev eth1 parent 1:1 classid 1:14 htb rate 11kbit ceil ${UPLINK}kbit prio 3
        tc class add dev eth1 parent 1:1 classid 1:15 htb rate 9kbit ceil ${UPLINK}kbit prio 3
        tc qdisc add dev eth1 parent 1:12 handle 120: sfq perturb 10
        tc qdisc add dev eth1 parent 1:13 handle 130: sfq perturb 10
        tc qdisc add dev eth1 parent 1:14 handle 140: sfq perturb 10
        tc qdisc add dev eth1 parent 1:15 handle 150: sfq perturb 10

        tc filter add dev eth1 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
        tc filter add dev eth1 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
        tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
        tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
        tc filter add dev eth1 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
        tc filter add dev eth1 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15

        # attach ingress policer;
        # slowdown download a bit
        tc qdisc add dev eth1 handle ffff: ingress

        # slowdown everything that’s coming in too fast
        tc filter add dev eth1 parent ffff: protocol ip prio 50 u32 match ip src \
           0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1

Script ini bekerja cukup baik pada ADSL tapi harus dicoba-coba sampai didapat nilai optimum untuk nilai di DOWNLINK dan UPLINK. Masalah umum ADSL adalah kecepatan upload yang jauh dibawah kecepatan download, dan karena sifat TCP/IP yang terus mengirim paket sampai akhirnya tidak ada tempat lagi untuk paket, biasanya modem akan hang. Dengan kecepatan dowload yang kencang biasanya user terus mendownload beberapa sites sekaligus sehingga akumulasi upload menjadi besar. Bila traffic upload ini mencapai modem ADSL maka modem akan hang.

Karena itu harus diatur agar traffic upload kita kontrol dan tidak mencapai modem ADSL hal ini dilakukan dengan menurunkan nilai UPLOAD sampai nilai optimum. Hal ini tercapai jika network latency mencapai nilai terendah dan network tidak putus. Selain itu set  MTU di modem anda di bawah 1500 (misalnya 1492), dan nilai yang sama juga diset di eth anda. Lebih jauh silakan baca pada dokumen LARTC Om Bert di atas.

rc.local di openSUSE

Tidak ada rc.local di openSUSE (he..he…he…)
Kalau kita lihat di RedHat (dan cloningnya) rc.local dijalankan setelah semua service selesai dijalankan di run level 5. Ini gak ada padanannya di openSUSE.

User biasanya mengira boot.local di /etc/init.d adalah padanan dari rc.local. Ini adalah perkiraan yang salah karena boot.local akan jalan paling awal sebelum service-service yang lain dijalankan. Sehingga seringkali user membuat script iptables dan disisipkan pada boot.local kemudian komplain karena scriptnya tidak jalan. Ini terjadi karena script iptables dipanggil sebelum service network dikonfigurasi di run level 3 sehingga sudah pasti tidak akan berfungsi.

Di openSUSE kita harus mengetahui pada saat mana script kita harus jalan apa saja syarat yang dibutuhkan, walaupun umumnya akan jalan di run level 3 dan 5. Misalnya kita ingin menjalankan script load balancing di atas, maka sebelum script ini jalan service network harus sudah jalan dulu.

Untuk dasar dari script tersebut kita dapat menggunakan file /etc/init.d/skeleton sebagai dasar, walaupun tidak tertutup kemungkinan menggunakan script lain seperti yang akan saya contohkan.

Script untuk traffic shapper:

#!/bin/sh
#
#
# /etc/init.d/mebwshaper_eth1
#
### BEGIN INIT INFO
# Provides:          mebwshaper_eth1
# Required-Start:    $network
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: Custom bandwidth shaping by medwinz@gmail.com
# Description:       Custom bandwidth shaping by medwinz@gmail.com
### END INIT INFO
#

test -s /etc/rc.status && . /etc/rc.status && rc_reset

case "$1" in
start )
        # script bandwidth shaping for SuSE 10.3 by medwinz@gmail.com
        # free to copy
        #

        echo -n "Starting bandwidth shaping HTB qdiscs in eth1"

        DOWNLINK=968
        UPLINK=110

        # clean existing downlink and uplink qdiscs, hide errors
        tc qdisc del dev eth1 root    2> /dev/null > /dev/null
        sleep 2
        tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
        sleep 1

        # make qdisc
        tc qdisc add dev eth1 root handle 1: htb default 15
        tc class add dev eth1 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
        tc class add dev eth1 parent 1:1 classid 1:10 htb rate 36kbit ceil 36kbit prio 0
        tc class add dev eth1 parent 1:1 classid 1:11 htb rate 36kbit ceil ${UPLINK}kbit prio 1
        tc class add dev eth1 parent 1:1 classid 1:12 htb rate 9kbit ceil ${UPLINK}kbit prio 2
        tc class add dev eth1 parent 1:1 classid 1:13 htb rate 9kbit ceil ${UPLINK}kbit prio 2
        tc class add dev eth1 parent 1:1 classid 1:14 htb rate 11kbit ceil ${UPLINK}kbit prio 3
        tc class add dev eth1 parent 1:1 classid 1:15 htb rate 9kbit ceil ${UPLINK}kbit prio 3
        tc qdisc add dev eth1 parent 1:12 handle 120: sfq perturb 10
        tc qdisc add dev eth1 parent 1:13 handle 130: sfq perturb 10
        tc qdisc add dev eth1 parent 1:14 handle 140: sfq perturb 10
        tc qdisc add dev eth1 parent 1:15 handle 150: sfq perturb 10

        tc filter add dev eth1 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
        tc filter add dev eth1 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
        tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
        tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
        tc filter add dev eth1 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
        tc filter add dev eth1 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15

        # attach ingress policer;
        # slowdown download a bit
        tc qdisc add dev eth1 handle ffff: ingress

        # slowdown everything that’s coming in too fast
        tc filter add dev eth1 parent ffff: protocol ip prio 50 u32 match ip src \
           0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1

        rc_status -v
        ;;

stop)
        # clean existing downlink and uplink qdiscs, hide errors

        echo -n "Delete all HTB qdiscs on eth1"

        tc qdisc del dev eth1 root    2> /dev/null > /dev/null
        sleep 3
        tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
        sleep 2
        rc_status -v
        ;;

restart)
        ## Stop the service and regardless of whether it was
        ## running or not, start it again.
        $0 stop
        $0 start

        # Remember status and be quiet
        rc_status
        ;;

    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;

esac
rc_exit

Kemudian lakukan symbolic link file tersebut ke /usr/sbin atau /sbin, misalnya dengan nama rcmebwshaper_eth1

> ln-s /etc/init.d/rcmebwshaper_eth1 /usr/sbin/rcmebwshaper_eth1

sehingga anda bisa memanggilnya dengan perintah

> rcmebwshaper_eth1 {start|stop|restart}

OK selamat mencoba. Till then keep safe and stop global warming  emoticon

 

 

PS:

Untuk sementara anda terima saja script ini, nanti akan saya jelaskan apa maksudnya di tulisan yang sedang saya buat. Selain itu agar hasilnya lebih baik anda harus melakukan packet marking dan mangling di iptables anda  emoticon

1 Comment »

The URI to TrackBack this entry is: http://medwinz.blogsome.com/2008/02/14/bandwith-shaper-di-opensuse/trackback/

  1. Terimakasih sekali mas.. cukup berguna posting ini bagi saya

    Comment by bimo — December 22, 2008 @ 3:12 pm

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>



Anti-spam measure: please retype the above text into the box provided.