การเปิดใช้งาน TRIM ของ SSD บน Ubuntu

TRIM คืออะไร

TRIM เป็นระบบที่จะจะทำการลบข้อมูลอย่างสมบูรณ์ เมื่อพื้นที่นั้นไม่เกิดการใช้งานแล้ว หรือง่ายคือถูกลบทิ้งไปแล้ว (ตามปกติ เวลาลบข้อมูลเราจะลบแค่เฉพาะส่วนที่อ้างอิงว่า file นั้นอยู่ส่วนไหนของ disk ทำให้ข้อมูลจริงๆไม่ถูกลบ และสามารถใช้โปรแกรมกู้ข้อมูลกลับมาได้บ้างส่วน) โดยการเขียนทับส่วนที่ไม่ใช้ด้วย 0

ทำไมต้องลบมันออกล่ะ

การ ทำงานของ SSD นั้นเวลาอ่านจะจะมีความเร็วเท่าเดิมเสมอ แต่เวลาเขียนนั้นจะช้าลงหากข้อมูลใน Disk มีมากขึ้นเรื่อยๆ เนื่องจากตัว Disk ต้องหาที่ๆไม่ใช้แล้ว จากนั้นจึงต้องเขียนลงไป ในกรณีที่ยังไม่ลบข้อมูลออกอย่างสมบูรณ์ ก็ยังถือว่าที่นั้นยังใช้อยู่ ทำให้ต้องอ่านข้อมูลทั้งหมดมา แล้วหาว่าตรงไหนที่เราเขียนได้แล้วบ้าง ดังนั้นหากไม่เปิด TRIM การเขียนข้อมูลจะทำได้ช้าลง

แล้วข้อเสียของ TRIM ล่ะ

จาก Patrick’s WebLog ได้อ้างว่าจากการทดสอบของเขา การเปิด TRIM ไม่ค่อยช่วยเลยในการทดสอบของเขา การเปิด TRIM ช่วยให้เขียนเร็วขึ้นเพียงเล็กน้อยเท่านั้น แต่การใช้เวลาในการลบ File อย่างสมบูรณ์นั้นมีมากกว่ามาก แต่ในความคิดผมคือปกติ TRIM น่าจะทำงานเบื้องหลัง ดังนั้นเราจึงไม่เห็นว่า TRIM ทำงานอยู่ตลอด และผมไม่แน่ใจว่าการทดสอบนี้ได้ทำ Disk ให้เต็มก่อนหรือมีข้อมูลด้านในเยอะๆก่อนรึเปล่านะครับ

โดยส่วนตัวผม ว่า TRIM ถึงจะมำให้การเขียน SSD ทำได้อย่างมีประสิทธิภาพมากขึ้น แต่อย่าลืมว่ามันเป็นการเขียนทับข้อมูล ทำให้อายุการใช้งานของ SSD สั้นลง เพราะ SSD จำกัดจำนวนครั้งในการเขียน

จะรู้ได้อย่างไรว่า SSD สามารถใช้งาน TRIM ได้หรือไม่

ทำได้โดยการเปิด Terminal แล้วสั่ง

sudo hdparm -I /dev/sda | grep "TRIM supported"

หากมีบรรทัดใหม่ขึ้นมาคือ SSD ตัวนั้นสามารถใช้งาน TRIM ได้

วิธีการเปิดใช้งาน TRIM

ทำได้ 2 วิธี

1. เพิ่ม Option ไปใน fstab ตรงๆ

จากในเว็บนั้นเค้าบอกว่า วิธีนี้ไม่ควรทำ (เพราะเหตุผลเรื่องความเร็วการเขียนที่ได้ ไม่ได้ดีขนาดที่ยอมรับความเร็วตอนลบ file ได้)

วิธีคือ สั่ง

gksu gedit /etc/fstab

แล้วแก้ส่วนที่ mount root เพิ่ม discard, ส่วนมากเพิ่มหน้าคำว่า error=remount-ro

<file system> <mount point> <type> <options> <dump> <pass> 
# / was on /dev/sdb1 during installation 
UUID=1cd2fc4f-7d99-4c7a-8ea7-6f9a2d5e5960 / ext4 discard,errors=remount-ro 0 1

แล้ว Save จากนั้น retstart เครื่อง

2.สั่งทำงานเป็น cronjon

แบบนี้คือสั่งให้ทำงาน trim ตามกำหนดเวลา ทำได้โดย

gksu gedit /etc/cron.daily/trim

ใส่ Code ตามนี้ลงไป

#!/bin/sh LOG=/var/log/trim.log
echo "*** $(date -R) ***" >> $LOG
fstrim -v / >> $LOG
fstrim -v /home >> $LOG

ก่อน Save ให้ลองทดสอบก่อนว่าระบบมี command line สำหรับสั่ง trim ไหมโดยพิมพ์ลง Terminal

sudo fstrim -v /

ที่ถูกต้องจะได้ประมาณนี้

andrei@ubuntu-desktop:~$ sudo fstrim -v /
/: 8158715904 bytes were trimmed

หากถูกต้องสมบูรณ์ให้ Save file แล้วสั่งคำสั่งนี้ใน Terminal

sudo chmod +x /etc/cron.daily/trim

ก็เป็นอันจบกระบวนการครับ

หากทำกับ Disk ที่มีการ encryption ไว้ต้อทำตามขั้นตอนเพิ่มด้วย ดูจากลิงค์ที่มาเองเลยครับ

ตัดมาจาก http://www.webupd8.org/2013/01/enable-trim-on-ssd-solid-state-drives.html

[SOLVE] เจอ Sorry, you can’t view or download this file at this time. ใน Google Drive แก้อย่างไร

คำเตือนปัจจุบันวิธีนี้ใช้ไม่ได้แล้ว ให้ไปทำตามลิงค์นี้แทนครับ

ปัญหา

สำหรับใครที่ใช้ Google Drive อยู่เวลาจะโหลดไฟล์อะไรบางท่านอาจจะเจอแบบนี้
picture show Sorry, you can't view or download this file at this time.

สาเหตุ

ไม่ ทราบแน่ชัด จากการ search จาก google ผมได้ความมาว่าหากมีการโหลดเกิน 28 ครั้ง ในครั้งที่ 29 จะขึ้นมา(คาดว่าเป็น 28 ครั้งต่อเดือน มั้งครับ) แต่ตอนผมลองทำดันโหลดได้เป็น 100 เลยครับ ไม่แน่ใจเลยครับ อาจจะนับ BW ขาออกรวมมั้งครับ

วิธีแก้

วิธีแก้ในกรณีของผู้อับโหลดผมไม่ทราบครับ คงต้องติดต่อ google drive เอาเอง

แต่ในกรณ๊ที่เราเป็นผู้โหลด สามารถแก้ได้ดังนี้ครับ

สิ่งที่ต้องเตรียม

  1. ลิงด์สำหรับโหลดไฟล์นั้น
  2. บัญชี Google ที่มี Google Drive และมีเนื้อที่เหลืออย่างน้อย 2 เท่าของขนาดไฟล์ที่ต้องการโหลด (เช่นจะโหลดไฟล์ขนาด 100 MB ต้องเหลือมากกว่า 200 MB)

เริ่มโหลดกัน

  1. ล้อกผินเข้าบัญชี Google เพื่อใช้งาน Google Drive
  2. เข้าไปยังลิงค์ Download อย่างไฟล์ที่ผมต้องการโหลดคือ ลิงค์นี้ (มัน อาจจะไม่โดน Limit นะครับ พอดีตัวที่ผมต้องการโหลดจริงๆ มันของละเมิดลิขสิทธิ์ ไม่อยาก reshare หรือ hotlink ครับ อันนี้เป็นเอกสารที่ผมจะเอามาอ่านเพิ่มเติม เพราะของที่เรียนมันเป็นอังกฤษ ขี้เกียจแปล)
  3. ค้นหาตัว ID ของไฟล์ให้ได้ ในกรณีของผมคือ 0B_8iG7NZUFynUXRIT2pKRlRNWms (มันอยู่ในลิงค์อ่ะครับ ส่วนมากอยู่กลัง id= และอยู่ก่อน & หรืออาจจะเป็นตัวแปลกๆยาวๆครับ สังเกตไม่ยาก)
  4. เข้าไปที่ https://docs.google.com/file/d/แทนตรงนี้ด้วย ID/edit เช่นของผมก็จะเป็น https://docs.google.com/file/d/0B_8iG7NZUFynUXRIT2pKRlRNWms/edit
  5. จากนั้นกดรูปโฟลเดอร์ข้างๆรูปดาวตรงชื่อไฟล์ครับ
    Click Folder Icon
  6. จะมีหน้าต่างขึ้นมา กดที่ MyDrive ให้มีเครื่องหมายถูกขึ้นหน้า MyDrive แล้วกด MoveSelect Destination and move
  7. เข้าไปที่ Google Drive ของเรา
  8. จะเห็นว่ามี File เพิ่มเข้ามาใน Drive ของเรา แต่เรากดไปก็ยังโหลดไม่ได้อยู่ดีนะครับ
    Found New File In Google Drive
  9. ให้คลิกขวาที่ไฟล์นั้น แล้วกด Make a copy
    Right Click And Make A Copy
  10. จะได้ไฟล์ใหม่มา ชื่อ Copy of ตามด้วยชื่อไฟล์เก่า มา ซึ่งเรามาสามารถโหลดจากตัวนี้ได้ครับ พอโหลดเสร็จก็สามารถลบทั้ง 2 ไฟล์ทิ้งได้เลย หรือลบต้นฉบับแค่ตัวเดียวก็ได้ครับ
    Get A Copy Of

เรียบร้อยครับ แค่นี้เราก็สามารถโหลดได้ปกติแล้วครับ วิธีง่ายๆใช่ไหมครับ

[บันทึก] นรก การกู้ WordPress แบบ DB ไม่ตรงกับกับเวอร์ชั่นไฟล์

เกริ่นนำก่อนคือ ผมเป็นโปรแกรมเมอร์แบบ Part time ให้กับเว็บไซต์เว็บหนึ่งซึ่งใหญ่พอสมควร คนเข้าระดับหลักหมื่นต่อวัน PageView ระดับ 2 แสนอับ ทำให้เค้าอยากให้ทำระบบ cache ขึ้นมาเอง (พวก plugin เค้าบอกใช้แล้วไม่ work) ซึ่งระบบนี้คือ cache แบบเป็น static file ทั้งหน้า บางส่วนที่เป็น comment ใช้ AJAX เอา( cache เหมือนกันด้วย เคลียเมื่อมีคน comment) โดย cache ส่วนอื่นที่ไม่ใช่ comment จะเคลียเมื่อถูกสั่งเท่านั้นไม่มีหมดเวลา ก็ใช่มาปีกว่าไม่มีปัญหา

ที นี้นรกเกิดเมื่อวันดีคืนดีไอ้ SSD ของ Server เจ้ากรรม แม่มเสือกพัง ทำให้ความซวยบังเกิดเพราะ backup ที่มีเป็นของ DB ตอนเดือน 5 แต่ตัว file ของ server ที่เคย backup ไว้มีของเดือน 2 ครับ (มีบางไฟล์ที่ได้ของเดือน 5 มา) ทีนี้พอเปิด server ปุป เข้าหน้าแรกเจอ 404 ภาพหายทั้งหน้า (555) แถมปัญหาเกิดทันที คือพอเว็บ run ขึ้นปุป โหลดพุ่งทันที ผมเลยตั้งประเด็นไปที่ cache ครับ ว่า ในระหว่าง 3 เดือนผมเคยไปทำไรมันรึเปล่า เนื่องจากไม่มีตัว version control ผลคืองมครับ ไม่ทราบว่ามันคืออะไรเกิดจากอะไร แต่เปิดปุปแม่มพัง

หลังจากงมไป ประมาณ 5 ชั่วโมง ว่าเป็นอะไรทำไม cache ไม่ทำงาน ผมดันกดผิดสิ่งที่ได้คือ หน้า 404 ผมเกิดความคิดบัดดลว่าไอ้เห้นี่แหละ ทำโหลดพุ่ง เพราะ cache ตัวนี้เนื่องจากไม่มีกำหนดเวลา ผมเลยไม่ cache 404 กลัวว่าถ้า cache ไปแล้วตอนหลังมีชื่อซ้ำมันจะเรียก cache ก่อน ทำให้การโหลด 404 ทั้งหมดต้องไป query DB เลยต้องดัก 404 ว่าไม่ต้องทำอะไรทั้งนั้นครับ เรื่องถึงได้จบ โหลดร่วงอย่างไว นั่งทำตั้งนาน

บันทึกไปศูนย์บริการ DTAC

อันนี้เป็นบันทึกความประทับใจเฉยๆ เรื่องมันมีอยู่ว่า SIM ผมเสียไป SIM นึง คือผมใช้ Multi Sim แล้ว Sim ที่ใช้โทรพัง ผมเลยเอา Sim จาก Tablet มาแก้เป็น Sim หลักใช้แก้ขัด

วันนี้ผมไปศูนย์เพื่อขอ SIM ใหม่ ไปถึงพี่เค้ากดบัตรคิวให้ แล้วก็รอยาวๆ (ประมาณ 10 นาที) แล้วเค้าก็เรียกไป

ไป ถึงเค้าก็ถาม “จะทำไรคะ” เราก็บอกเปลี่ยน sim ครับ sim พัง เค้าก็ไปหยิบ sim ใหม่มาให้ แล้วเค้าก็ขอดู sim ที่พัง ตรงนี้แหละปัญหาเกิด เพราะรหัสบน sim ไม่ตรง(เพราะ sim หลักมันกลายเป็น sim ที่ผมใส่ในมือถือไปแล้ว 55+) เค้าก็ขอดู sim ที่ใช้ได้อยู่ ผมก็ให้เค้าไปนั่งมั่วสักพัก เค้าก็จดเบอร์ แล้วก็บอกรอสักครู่นะคะ แล้วก็เก็บเรียบ 2 sim หายไปราวๆ 10 นาทีจึงเสร็จ(ไม่น่าซนเลยกรุ ไม่งั้นเสร็จนานและ) ก็จบเรื่องนี้แต่วันนี้ผมไม่ได้มาเรื่องเดียวครับ

แต่ก่อนที่ผมจะได้ เอ่ยอะไร ก็มีพี่อีกคนมาแนะนำบอกให้เปลี่ยน package เพราะ package ปัจจุบันมันกาก(เค้าไม่พูดงี้หรอก แต่จับใจความได้งี้แหละ) คือของเก่าผมใช้ 899 บาทได้ 3G 2GB โทรฟรีกี่นาทีไม่รู้ลืม แต่เค้าแนะนำ package 799 บาท ได้ 3G 3GB แต่เค้าบอกโทรฟรีลดลง 50 นาที

ซึ่งอันนี้แหละจุดประสงค์ ที่ 2 ผมมาเปลี่ยน package คือผมเนี่ยทั้งเดือนโทรนิดเดียว เอามาทำไมเป็น 100 นาที ผมเลยขอเค้าแบบเป็น internet อย่างเดียว พอเค้าเปลี่ยนผลเค้าบอกระบบไม่ยอมให้เปลี่ยน เค้าเลยยกเลิก Multi Sim แล้วสมัครใหม่ ให้ได้ปกติ ที่น่าตกใจคือผมขอดูค่าโทรย้อนหลังผมเฉลี่ยเดือนนึงผมโทรไม่ถึง 20 นาที(ที่น่าตกใจกว่าคือมันเกิน 10 นาทีได้ไงวะ?)

สรุปที่ประทับใจคือเค้าเห็นใจลูกค้าอยากให้ลูกค้าได้ของที่ดีที่สุดในราคาเดิมหรือถูกกว่าครับ

ปล จริงๆลืมยกเลิกบริการ SMS

Challenge Accept เขียนภาษา C หาค่า Max ในบรรทัดเดียว

พอดีวันนั้นเล่น Facebook อยู่ดีๆแล้วเจอคำท้านี้เข้าครับ ผมเลยลองจัดสักหน่อย

นี่เป็น Function ที่ผมเขียนได้

int max(int *p){
return *(p+1)==0 ? *p : (*p > *(p+1) ? (((*(p+1) = *p) & 0) | max(++p)) : max(++p));
}

ส่วนอันนี้เป็นตัวอย่างวิธีใช้แบบเต็มๆ

#include <stdio.h>

int max(int *p){
	return *(p+1)==0 ? *p : (*p > *(p+1) ? (((*(p+1) = *p) & 0) | max(++p)) : max(++p));
}

int main(){
	int p[]={3,5,1,8,9,12,3,5,6,7,0};
	int i;
	//printf("%d\n",12 & 0);
	printf("%d",max(p));

	//for(i=0;i<10;i++) printf("%d\n",p[i]);
	return 0;
}

 

จาก Code นี้มีข้อจำกัด 2 เรื่อง

  • ข้อมูลในตัวแปรที่ส่งเข้าไปหายหมดนะครับ(คือมันจะเละไม่ได้ข้อมูลเดิมชัวร์)
  • ตัวสุดท้ายของ Array ต้องเป็น 0 เสมอ (จริงๆถึงไม่ 0 ส่วนมากมันก็เจอ 0 ถ้า index out of bound แต่ไม่ทุกกรณีแค่นั้น)

อธิบาย Code แบบเป็นส่วนๆ

  • *(p+1)==0 ? *p : บอกว่า *(p+1) (ค่าตัวหน้า) เป็น 0 รึเปล่า ถ้าใช่หมายถึงจบ จะ return *p (ค่าปัจจุบัน) ถ้าไม่ใช่ทำข้างล่าง
  • (*p > *(p+1) ? (((*(p+1) = *p) & 0) | max(++p)) : max(++p))
  • ถ้า *p > *(p+1) (ค่าปัจจุบันมากกว่าค่าถัดไป) เป็นจริง ให้ทำ (((*(p+1) = *p) & 0) | max(++p)) ตรงนี้ต้องแยกเป็นส่วนย่อยๆเยอะๆ
    *(p+1) = *p คือกำหนดค่าในช่องถัดไป เป็นค่าปัจจุบัน(เพราะค่าปัจจุบันมากกว่า)
    & 0 คือบรรทัดบนจะ return ค่า *p มา แต่เราไม่ต้องการจึง & 0 เพื่อบังคับให้   (((*(p+1) = *p) & 0) เป็น 0
    | คือการ or แบบ bit ซึ่งผมเอามาใช้ให้มันทำ 2 คำสั่งในบรรทัดเดียว จะได้ 0 | max(++p) คือโดยค่าถัดไปให้ max ไป recursion จากนั้นค่อย return
    การเอามา & 0 แล้ว or ทำให้มัน return เฉพาะค่า ที่มาจาก max(++p)
  • ถ้า  *p > *(p+1) (ค่าปัจจุบันมากกว่าค่าถัดไป) เป็นเท็จ return max(++p) ไปเทียบตัวต่อไปว่ามากกว่าไหมจนกว่าจะจบ

Code เหี้ยมากๆ อ่านไม่รู้เรื่องแน่ความหน้า Note กรุก็ไม่มั่นใจว่าอ่านอีกทีจะเข้าใจไหมเนี่ย 55+