Skip to main content

รีดประสิทธิภาพ Endian Firewall จาก hardware ที่เริ่มตกรุ่น

Posted in

OBJWALL.OBJ.COM
# =================Endian Firewall 2.2 RC2 Installation log =================
ติดตั้ง Endian Firewall 2.2 RC2 ทดแทน Firewall ตัวเก่า โดยใช้ hardware proxy server เดิม
(ส่วน proxy server ได้ตัวใหม่ (เก่ามาจากงานอื่นแต่ยังแรงพอ) )
เกิดความเสียดายประสิทธิภาพ เพราะ squid ของเดิมใช้  harddisk 3 ลูกจึงจับมา modify

objproxy.obj.com เครื่องใหม่จะรับผิดชอบ cache object ขนาด  0 ถึง 512 KB ซึ่งเป็นขนาด object ที่มีอัตราการเรียกใช้งานซ้ำสูงมาก
(พวก Icon,Glyph, Animation,รูปภาพส่วนใหญ่อยู่ในกลุ่มนี้ทั้งนั้น)
*คนทำงานก็จะได้เลิกบ่นว่าเน็ทช้า
ส่วน objwall.obj.com เครื่องนี้จะรับผิดชอบ cache object ขนาด  128 ถึง 8192 KB มีอัตราการเรียกใช้งานต่ำ
ทีนี้จะเปิดให้โหลดไฟล์กันกระจาย เพราะมี Hardware รองรับแล้ว พวก MP3 และ คลิบมือถือ หละตัวดี
(MP3 ขนาดประมาณ 2 - 4 MB, คลิบมือถือ ขนาด 256 KB -  8 MB )
*คนนั่งเล่นก็จะได้ดีใจเพราะ Office นี้ชอบโหลดไฟล์ซ้ำซ้อน

# ----------------------- Hardware List
PC objproxy.obj.com ตัวเดิม CentOS4 (Harddisk มี BAD.... Boot แล้วเพี้ยน Service ตายหลายตัว แต่ยังใช้การได้)
1 x CPU P4 3.0HT
1 x VGA Card รุ่นใหญ่
1 x Mainboard Bigabyte + 3 PCI Slots + VGA  onboard + Sound onboard
2 x 512MB RAM TOTAL 1024MB
3 x 10/100Mbps NICs + 1 Onboard 10/100Mbps Total 4 NICs
3 x ATA Harddisk 7200 rpm. 80 GB. buffer 8 MB
1 x PSU 550 watts 

# ----------------------- เพิ่ม - เปลี่ยน
1 x Mainboard battery 
3 x พัดลม อย่างดี  (ตัวละ 200 บาท)
1 x ทาซิลิโคน CPU ใหม่
1 x VGA card หาตัวที่กินไฟน้อยๆและใช้ heatsink มาใส่แทน

* 1 x PSU 550 watts  ธรรมดาๆ อาจจะต้องเปลี่ยนเป็น Enermax 460 watts (2600 บาท)

# ----------------------- ติดตั้ง
0. เป่าลมทำความสะอาด
1. harddisk ติดตั้งช่องเว้นช่องหรือมีช่องว่าง ร้อนมากๆพังง่าย
2. พัดลม  Harddisk 1 ตัวดูดลมเข้าจากด้านหน้า ดูดเข้าจากฝาข้าง 1 ตัว ดูดออกทางด้านหลังอีก 1 ตัว
3. สายไฟพัดลม ห้ามพ่วง Harddisk หรือ CD   (มีผลต่อความเร็ว) 
4. ทำความสะอาด เป่าลม ปัดครีบ Heatsink ทาซิลิโคนใหม่ (ใช้ซิลิโคนเงิน) 
5. ใช้สาย flat cable 40 pares เท่านั้น...  (มีผลต่อความเร็ว) 
6. เอา RAM + การ์ดแลน + Display Card มาขัด หน้า contact
7. เพื่อใช้ Mode DMA ต้องติดตั้ง RAM ที่ Bank แรกเสมอ   (มีผลต่อความเร็ว) 
8. สายไฟ Harddisk และ CD แยกกันทุกลูก   (มีผลต่อความเร็ว) 
9. ต่อสาย IDE และปรับ Jumper ให้ตรง  (มีผลต่อความเร็ว) 
Primary --> Master --> Hdd สลับกับตัว Secondary  --> Slave ของเดิม
Primary --> Slave --> CDROM  ปลดสาย 40 pare ออกเมื่อติดตั้งระบบเสร็จสิ้น
Secondary --> Master --> Hdd cache เดิม
Secondary  --> Slave --> Hdd   สลับกับตัว Primary --> Master  ของเดิม
10. เปลี่ยนถ่าน Mainboard    (มีผลต่อเวลาเริ่มระบบ) 
11. พันสายไฟให้เรียบร้อย

# ----------------------- BIOS Checking....
1.  Download Firmware มา Upgrade  BIOS
3. ปิดโหมด harddisk S.M.A.R.T   (มีผลต่อความเร็ว) 
4. เปิด Mode DMA   (มีผลต่อความเร็ว) 
5. ปิด Sleep , suspend, Antivirus, Sound, Serial,Parallel....   และ Feature ที่ขัดจังหวะอื่นๆ

# ----------------------- Partitioning
1. สลับ Harddisk 1  /dev/hda มี BAD Sector ไปใว้เป็นตัวสุดท้าย
2. Format Harddisk 2 ลูก
#  ----- /dev/hdc
/dev/hdc1    1000 MB Swap
/dev/hdc2    5000 MB ext2
/dev/hdc3   70000 MB ext2
#  ---- /dev/hdd
/dev/hdd1    1000 MB Swap
/dev/hdd2    5000 MB ext2
/dev/hdd3   70000 MB ext2

* Partition  แบบ ReiserFS และ Ext2  จัดการกับไฟล์ขนาดเล็กได้เร็วกว่า Ext3 แต่ Endian ไม่ Support ReiserFS จึงเหลือตัวเลือกที่ดีเพียง Ext2
* Mount partition ด้วย Options : notail,noatime,nodev

# ----------------------- Configurations

ติดตั้ง Endian Default IP = 192.168.10.248 Default password = xxxxxx
ตั้งค่า NIC ชั่วคราวเป็น 192.168.10.240/24 แล้วเข้าระบบด้วย https://192.168.10.248:10443

GREEN
192.168.10.248/24
ORANGE
192.168.20.248/24
BLUE
192.168.30.248/24
RED
192.168.1.248/24
NAME : objwall.obj.com
GW  :192.168.1.1
DNS1 :  203.113.127.199
DNS2 : 203.113.24.199

# ----------------------- system -> เปิด SSH ------------------------
                -> Allow TCP Forwarding
# ----------------------- network -> add a host ------------------------
192.168.10.248 objwall.obj.com
# ----------------------- service -> DHCP
                 -> Enable on green, orange, blue
192.168.10.10-192.168.10.248
192.168.20.10-192.168.20.248
192.168.30.10-192.168.30.248
Primary DNS = Self
Secondary DNS = 203.113.127.199 (TOT)
Primary NTP = Self
Secondary NTP = 202.44.204.9 (nucleus.nectec.or.th)
Primary WINS = Self

# ----------------------- service -> ClamAV ------------------------
Update daily
# ----------------------- service -> NTP  ------------------------
               -> Overide default NTP
202.44.204.9 (nucleus.nectec.or.th,clock.nectec.or.th)
203.185.69.60  (สำนักงานมาตรวิทยา)

# ----------------------- service -> intrution detction  ------------------------
       Enable snort on RED
       Update daily
       Update now!
# ----------------------- service -> Traffic monitoring  ------------------------
    Enable
    https://192.168.10.248:3001/
# ----------------------- firewall -> Port forwarding
tcp   any uplink   10001 to 192.168.20.250:10001 # webmin on Orange -> objproxy.obj.com

# ----------------------- firewall -> outgoing forewall
   เปิด port 11,10001,10002,10003,10004,10005,10006,10007,10008,10009,10443 จาก Any source/TCP ไปยัง red
  สำหรับ Switch, SARG, CACTI, WifiAccessPoint
# ----------------------- firewall -> system access
 รับ จาก User defined port 22,10443 : TCP  ที่เข้ามาทาง RED : 0.0.0.0
# ----------------------- Proxy ->  FTP Proxy Enable on Green เท่านั้น

# ----------------------- Proxy -> เปิด HTTP Proxy สำหรับ Object size 128 -  8192 KB   =======================================
                  (ส่วน Object ขนาดเล็ก 0 - 256 KB ให้ไปใช้ objproxy.obj.com ตามปกติ)

Transparent mode
Visible hostname : objwall.obj.com
admin : xxxx@gmail.com
   -> cache management
Harddisk cache size ลูกละ 45000 MB (45000 MB x 3 = total 135 GB. )    
Memory cache size  300 #  เปิด
Max object size 8192 
Min object size 128

# ----------------------------------------------------------------------------  
# ----- คำนวนขนาด cache_dir ดังนี้
Endian ใช้ /dev/hda4 เป็น (/var)   เนื้อที่ประมาณ 45 GB.
              บีบ partition /dev/hda3 (/)จาก 25000 MB เหลือ 10000 MB
              ขยาย /dev/hda4  (/var)  เป็น 60 MB
ตั้งค่า cache_dir = 45000 MB.
# ----- คำนวนจำนวน cache_dir level 1 directory สำหรับ Harddisk แต่ละ ลูก ดังนี้
((((45000MB = 45000000 KB)/ (average_object_size เริ่มที่ 128 KB ))/256 (2nd level directories) )/256 (objects on each directory) ) = 5.37 ปัดเศษขึ้นเป็น Integer =  6
# ----- คำนวนกลับทาง
            เก็บได้ มากสุด = 6 (1st level directory ) * 256 (2nd level directory) * 256 ( Object per each 2nd level directory)  = Total 393216 ไฟล์  
            * 3 (  Harddisk 3 ลูก) Grand Total = 1179648  ไฟล์
            * 128 (ใช้ Minimum Objects size คำนวน ) = รวมเนื้อที่อย่างน้อย =   150994944 KB =  150994 MB = 150 GB
            ( Total  cache_dir  แค่ 135 GB. คิดกลับทางแล้วได้มากกว่าเพราะปัดเศษ จำนวน 1st level dir 5.37 เป็น 6 )
# ในการใช้งานแบบปกติ อาจจะเอา จำนวน 1st level directory มาคูณ 2  หรือ 1.5
   เพราะหาก average_cache_object_size เล็กกว่าที่ประมาณ ต้องมี 1st level direcory เยอะกว่าเดิม  จึงจะใช้พื้นที่ cache_dir ได้คุ้ม
  กรณีนี้ เอา minimum_object_size มาคำนวน ยังไงขนาดไฟล์ก็ไม่เล็กกว่านี้อีกแล้ว จึงไม่ต้องเผื่อจำนวน  1st level direcory 

# ----- squid default 
cache dir /var/spool/squid 500 16 256
คำนวนด้วย average_object_size ที่ 13 KB.
* ถ้าเราใช้ เต็ม 500 MB จะต้องการ 1st level direcory  แค่ (((500000/13)/256/256) = 0.59  integer = 1
* squid default : 1st level direcory = 16 และ average_object_size ที่ 13 KB. สามารถใช้พื้นที่มากถึง
 13( average_object_size KB) * 16 (1st level direcory ) * 256  (2nd level direcory )  * 256 (Files per 2nd level direcory)
  = 13631488 KB = 13631 MB = 13 GB. ครับ
*ถ้าตั้ง cache_dir เกิน 13 GB. โดยที่ average_object_size <= 13 และ  1st level direcory = 16 
   ต้องปรับเพิ่มจำนวน 1st level direcory เป็น 24 หรือ 32
* ถ้าคิด Default 1st level direcory = 16 ที่การใช้งานทั่วไป (OCT-2008) average_object_size ประมาณ 14 - 20 KB (ที่ maximum_object_size 4096 default )
   สามารถใช้พื้นที่ cache_dir ถึง 18 GB. ครับ

# -----  ทำไมไม่เผื่อ 1st level direcory  เอาใว้เยอะๆเลย  ... เพราะเป็นภาระให้ Squid ต้องจัดการครับ
    *ยิ่งมีตัวแปรในระบบน้อยๆ ก็ยิ่งทำงานได้เร็ว ตามสูตรของฝรั่งเอาค่าที่คำนวนได้ * 2 ถือว่าเผื่อใว้เยอะ
    *ยังมีปัจจัยอื่นๆที่ทำได้ง่ายกว่าและมีผลต่อความเร็วเยอะกว่านี้อีก
    *การคำนวนอย่างละเอียดทำเพื่อความเข้าใจในระบบจัดการ cache
    และหาแนวทางรีดประสิทธิภาพของ squid (ซึ่งจะช่วยให้ประหยัดงบประมาณ จัดซื้อ)

# ----------------------------------------------------------------------------   
/dev//hda4    Default ของ Endian บีบ Partition ใหม่   
    :  cache_dir diskd /var/spool/squid 45000 6 256
/dev//hdc3     สร้างใหม่   
    :  cache_dir diskd /cache2 45000 6 256
/dev//hdd3     สร้างใหม่  
    :  cache_dir diskd /cache2 45000 6 256
# ---------------------------------------------------------------------------- 
SSH เข้าไปแก้ระบบ
* ดู Partition เดิม
df -h
# -------
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda3              24G  411M   23G   2% /
/dev/hda1              31M  7.4M   22M  26% /boot
/dev/hda4              48G  159M   46G   1% /var
# -------
ที่ Root directory
mkdir cache2
mkdir cache3
*** โอนให้ Squid
chown squid.squid cache2
chown squid.squid cache3

mount /dev/hdc3 /cache2 -O notail,noatime,nodev
mount /dev/hdd3 /cache3 -O notail,noatime,nodev
***** ดู Partition ใหม่
root@objwall:/ #  df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda3              24G  411M   23G   2% /
/dev/hda1              31M  7.4M   22M  26% /boot
/dev/hda4              48G  159M   46G   1% /var
/dev/hdc3            69G   52K  69G   1% /cache2
/dev/hdd3            69G   52K  69G   1% /cache3
* โอนPartition  ให้ Squid
chown squid.squid cache2
chown squid.squid cache3

# ----------------------------------------------------------------------------  
    แก้ไฟล์เริ่มระบบให้ Mount Harddisk อีก 2 ลูก
* ปรับขนาด NIC 10/100Mbps. :  txqueuelen 2000 mtu 1492 หรือ 1496  หรือ 1500
                      ( NIC 10/100/1000 Mbps. :  txqueuelen 10000 )
vi /var/efw/inithooks/start.local
#!/bin/sh
# ---bof
# ****  Modified by radhanasiri@gmail.com - OCT 2008
mount /dev/hdc3 /cache2 -O notail,noatime,nodev
mount /dev/hdd3 /cache3 -O notail,noatime,nodev
ifconfig eth0 txqueuelen 2000 mtu 1492
ifconfig eth1 txqueuelen 2000 mtu 1492
ifconfig eth2 txqueuelen 2000 mtu 1492
ifconfig eth3 txqueuelen 2000 mtu 1492
squid -k reconfigure
exit 0
#--- eof

# ----------------------------------------------------------------------------  
#แก้ไฟล์ต้นแบบ
vi  /etc/squid/squid.conf.tmpl

# cache_dir aufs /var/spool/squid $CACHE_SIZE 16 256
แก้เป็น
cache_dir diskd /var/spool/squid $CACHE_SIZE 6 256
เพิ่ม
cache_dir diskd /cache2 $CACHE_SIZE 6 256
cache_dir diskd /cache3 $CACHE_SIZE 6 256

#แก้ไฟล์ config
vi  /etc/squid/squid.conf
pid_filename /var/run/squid.pid
# cache_mem  ไม่ควรต่ำกว่า 32 MB  แนะนำเอา RAM ที่เหลือ( หลังจาก boot ) หาร 3 หรือ 4
cache_mem 128 MB 
cache_dir diskd /var/spool/squid 45000 6 256
cache_dir diskd /cache2 45000 6 256
cache_dir diskd /cache3 45000 6 256

# ----------------------------------------------------------------------------  
# หยุด squid
root@objwall:/ # ps -ef | grep squid
root      8656     1  0 00:24 ?        00:00:00 squid -D
squid     8658  8656  0 00:24 ?        00:00:00 (squid) -D
squid     8660  8658  0 00:24 ?        00:00:00 (unlinkd)
root      9139  9101  0 09:47 pts/0    00:00:00 grep squid
kill -9 8656 8658 8660

#ลบ cache เดิม แล้วสร้าง  cache ใหม่
rm -rf /var/spool/squid/*
squid -z

#   Reboot 1 ครั้งเพื่อดูผลงานว่า Run ได้แน่นอน
ตรวจสอบการเรียกใช้เนื้อที่ Disk
ps -ef | grep squid

# ----------------------------------------------------------------------------  
# --------- World Wide NTP
pool.ntp.org   ทั่วโลก
asia.pool.ntp.org
th.pool.ntp.org
# ----------------------------------------------------------------------------  
  การทดสอบและคำนวน cache_dir parameter
# --------* ทดสอบบน CentOS 4.x, 5.x 
* เร่งความเร็ว Harddisk ATA (ถ้ามี hdparm)
      hdparm -d1 -c1 -m16 /dev/hdx
#hdparm -Tt /dev/sda3

ATA 66     5400rpm.  40 MB/s โดยเฉลี่ย (ขึ้นอยู่กับขนาด buffer อีกด้วย)
ATA100    5400rpm   55 MB/s
SATA300  7200rpm  75 MB/s
SCSI320  15000rpm  115MB/s

# --------ขนาดของ cache_dir และประสิทธิภาพของ Harddisk 
เป็นขนาดที่ให้ประสิทธิภาพได้ค่อนข้างดี บางท่านอาจจะใช้มากกว่าหรือน้อยกว่านี้
ATA 66      cache_dir  600 MB ต่อลูก
ATA100    cache_dir   1200 MB ต่อลูก
SATA300  cache_dir  2400 MB ต่อลูก
SCSI320  cache_dir  5000 MB ต่อลูก

# -------- สรุปขนาดของ cache_dir และความต้องการใช้งานจริง   ประมาณจากจำนวณ Clients
20 PCs   30 MB/Client = Total 600 MB (1 x ATA100)
60 PCs  25 MB/Client = Total 1500 MB (3 x ATA66 )  (2 x ATA100)  (1 x SATA300) 
200 PCs   20 MB/Client = Total 4000 MB (4 x ATA100) (2 x SATA300) (1 x SCSI320)
600 PCs   15 MB/Client = Total 9000 MB  (4 x SATA300) (2 x SCSI320)
2000 PCs   10 MB/Client = Total 20000 MB (4 x SCSI320)
6000 PCs   5 MB/Client = Total 30000 MB  (6 x SCSI320)

# -------- ขนาดของ cache_dir และใช้งานจริง
กำหนด cache_dir ทดสอบสัก 20 GB. เปิดใช้ไป 1 สัปดาห์  ขนาด cache โตขึ้นเท่าไรก็เอาค่านั้นมาใช้
*ไม่ควรทดสอบน้อยกว่า 3 วัน
 * น้อยกว่า 3 วัน เก็บ cacheได้ไม่นานใช้เนื้อที่ถึงระดับ cache-swap_high  ก็ต้องลบ cache ที่เพิ่งเก็บ (ลบถึง cache-swap_low) เพื่อให้มีเนื้อที่บันทึก object ใหม่ๆ
    ผ่านไปครึ่งวันยังใช้ cache ไม่คุ้ม หรือยังไม่ทันได้เรียกใช้ด้วยซ้ำ เจอ cache-swap_high อีกก็ถูกลบอีกกลายเป็นวงจรอยู่แบบนี้
    Harddisk ทำงานหนักมากโดยไร้ประโยชน์
 * น้อยกว่า 3 วัน อาจจะประมาณการใช้งานจริงไม่ได้ เจอวันหยุดเสาร์อาทิตย์เข้าไป ก็จบแล้ว จึงควรทดสอบในช่วงของการทำงานจริง
      หรือจะเอาขนาด cache_dir ที่เพิ่มขึ้นในแต่ละวัน มาคำนวน แทนก็ได้ครับ
* ไม่ควรทดสอบเกิน 3 สัปดาห์ เพราะจะได้ขนาดเนื้อที่เยอะเกินไป กว่าจะถึง cache-swap_high
   หรือถึงเวลาเรียกใช้งานจริงปรากฏว่าข้อมูลล้าสมัยไปแล้วก็ต้องไปโหลดของใหม่มาเก็บใว้แทนอีก เสียเวลาเปล่าๆ
*การกำหนดจำนวนที่เหมาะสม จะช่วยให้ squid จูน cache ได้ดีขึ้น  ประมาณว่า object ที่ถูกเรียกใช้ซ้ำบ่อยๆเท่านั้น จึงจะมีสิทธิ์อยู่ใน cache
และ  object  ที่ล้าสมัยหรือมีโอกาสเรียกใช้น้อยก็ควรถูกลบโดยเร็ว
  
*สรุป ถ้ามีเน็ทความเร็วสูง ทดสอบ cache 1 สัปดาห์ จะได้ขนาดที่เหมาะสม
    ถ้ามีเน็ทช้า เช่น IPStar ทดสอบ cache 2 สัปดาห์ จะได้ขนาดที่เหมาะสม

# -------- ตรวจสอบการทำงานของ Squid (Advance proxy บน Endian )
#squidclient -p 8080 mgr:info
ได้ค่าที่มีผลต่อการเร่งความเร็วหลายตัว เช่น
* Mean Object Size
 (ใช้ แทนค่า average_object_size ในการคำนวน )
* Available number of file descriptors
ถ้ามีเหลือน้อย จะต้อง compile squid หรือ kernel ใหม่
Endian  Default มาที่ 28000 กว่าๆ  ต่อให้มีเครื่องลูกถึง 1000 เครื่องเข้าใช้ Squid พร้อมกันก็คงไม่หมด
กรณีของ CentOS default มาที่ 1024 เครื่องลูกเข้าพร้อมกันสัก 50 เครื่องก็เริ่มจะหมดแล้ว มักจะต้อง compile kernel ใหม่
*DNS Lookups
 #time  nslookup www.yahoo.com
  ถ้าเกิน 300 ms ผมถือว่าช้านะครับ
  ลองเปลี่ยน DNS ดู
  หรือทำ DSN caching จะเร็วขึ้นเยอะ
  ทดสอบว่า ใช้ Internel DSN caching  ของ squid กับ DNS อื่นๆ อย่างไหนเร็วกว่ากัน
* Cache Misses ถ้านานเกิน 500 ms ถือว่าระบบช้านะครับ

# --------  หากกำหนดขนาด cache_dir ใว้พอดีไม่ต้องลบ cache ทิ้ง
เมื่อ ใช้พื้นที่ cache ไปถึง cache_swap_high (default ที่ 95% ของ จำนวน cache_dir ) squid จะลบ cache เองจนเหลือเท่ากับค่า cache_swap_low (default ที่ 90%)
ใช้ไปนานๆ object ที่ไม่ค่อยมีการเรียกใช้ก็จะถูกลบออกไปมากขึ้นเรื่อยๆ เหลือใว้เฉพาะ Object ที่ใช้บ่อยๆยิ่งโหลดเว็บได้เร็ว
# -------- การแบ่ง cache_dir partition  ควรแบ่งใว้โตกว่า ขนาด cache dir อย่างน้อย 30 %
เพราะต้องกันพื้นที่ส่วนหนึ่งใว้สำหรับ FS  ใช้
* ในทางปฎิบัติจริงแบ่งใว้อย่างน้อย  = cache_dir * 2 หรือเผื่อขยายพื้นที่ เป็น *5 *10 ก็ได้
* การเปลี่ยนขนาด cache_dir โดยไม่ต้องสร้าง cache ใหม่ ให้เปลี่ยนตัวเลข ได้เลย
เช่น cache_dir diskd /cache2 800 8 256 เพิ่มลดตัวเลข 800 ตามด้วย squid -k reconfigure ก็ใช้ได้ตามปกติ 
แต่ถ้าแก้   diskd หรือ /cache2 หรือ 8 หรือ 256 จะต้องลบแล้วทำ cache ใหม่

# ======================================