บันทึกการแก้ปัญหา Sign in นานบน Windows

อาการที่พบ

เวลาในการ Sign in บน Windows นานมากๆ เป็นหลักนาที แม้ว่าจะใช้ SSD M.2 แล้วก็ตาม ใน Event Viewer > Applications มี Warning ที่ Winlogon ว่า “The winlogon notification subscriber is taking long time to handle the notification event (Logon).

อาการนี้เป็นทุกครั้งที่ Sign in ไม่ว่าจะ boot เครื่องมาครั้งแรก หรือแม้แต่ Sign out แล้ว Sign in ใหม่

วิธีแก้ปัญหา

เข้าที่ไปที่ %userprofile%/AppData/Local/Temp แล้วลบทุกอย่างออกให้หมดเท่าที่จะลบได้ จากนั้น Signout แล้วทดลองใหม่

บันทึกวิธีการหาสาเหตุ

เนื่องจากเหตุการนี้เกิดตอน Sign in แล้วระหว่างที่กำลัง Sign in เราแทบไม่มีทางรู้เลยว่ามันไปช้าตรงไหน มีโปรแกรมอะไรทำบ้าง ตอนแรกสงสัยพวก Google Drive, OneDrive, JottaCloud และ Backblaze คิดว่ามันทำงานพร้อมกัน จน IO เต็ม แต่หลังจากลองปิดหมดแล้ว อาการนี้กับไม่หาย

สิ่งแรกที่คิดจะทำคือเราต้องเปิดโปรแกรม Monitor ให้ได้ว่าตอน Sign in เกิดอะไรขึ้น ตอนแรกที่คิดเลยคือ คิดแบบง่ายเข้าอีก User นึงแล้วไปเปิดโปรแกรม Monitor ไว้ แล้วกลับมา Sign in ที่ user ที่มีปัญหา แต่ดันทำไม่ได้ เพราะตอนแรกจะดู real time โดยใช้ Remote Desktop เข้ามาดู Task Manager แต่ตัว RDP Wrapper ที่ทำให้ Sign in ใช้ได้พร้อมกัน 2 users ขึ้นไปดันใช้ไม่ได้ซะงั้น

แต่ที่จากข้างบนดันบังเอิญเจอว่าอีก User มัน Sign in เร็วมาก ตอนนี้เลยตัด OS ออกได้เลย น่าจะเป็นที่ระดับ User เลยพยามยามหาสาเหตุต่อ เช่นหาโปรแกรมมาเช็คว่ามีตัวไหน Start up มาตอน Sign in แล้วน่าสงสัยไหม จนเจอว่าใน Event Viewer > Applications มี Warning ที่ Winlogon มี Event Id เป็น 6005 และ 6006 มีความว่า “The winlogon notification subscriber is taking long time to handle the notification event (Logon).” เมื่อลอง Google ดูมีคนเดาสาเหตุหลายอย่าง ซึ่ง 1 ในนั้นคือบอกว่าควรทำให้ Home User Directory ขนาดเล็กลงนะ แต่จากการพยายามลองทำก็ไม่ช่วยเท่าไหร่ (ย้าย VM กับ Code ออกไปที่อื่น, ลบ Cache npm)

สุดท้ายเลยพยามยามเปิดโปรแกรม Monitor ที่หน้า Sign in นั่นแหละ โดยประยุกจากวีดีโอนี้ ซึ่งหลักการที่เค้าทำคือ การแก้ sethc.exe ซึ่งจะถูกเรียกเมื่อเรากด Shift รัวๆ แล้วมี dialog ขึ้นมา ให้กลายเป็น cmd แทน เนื่องจากเรายังสามารถใช้ windows ได้อยู่ไม่เหมือนในวีดีโอที่เค้ามีปัญหาว่า Sign in ไม่ได้ เลยทำง่ายกว่ามากคือเปิด cmd ด้วยสิทธิ์ Administrator แล้วเข้าไป C:\Windows\System32 แล้วคัดลอก sethc.exe ตัวเดิมไว้ แล้วคัดลอก cmd.exe มาแทนที่ sethc.exe แทนที่ซะ จากนั้นก็ Sign out แล้วไปกด shift รัวๆหน้า sign in เราก็จะได้ cmd มาใช้แล้ว

หลังจากได้ cmd มาใช้ผมก็ใช้ Process Explorer เพื่อพยายามดูว่ามี process ไหนใช้ CPU สูงไหม ปรากฏว่าไม่ขึ้นเลยครับ รอนานมากและไม่มีใครใช้ CPU มากจนน่าสงสัย และไม่มี process ของ user ที่มีปัญหาเลย พอรอจนมี process ของ user นั้นก็ เป็น sign in เข้าได้เลย แสดงว่าช้าก่อน sign in สำเร็จ แต่จุดหน้าสังเกตุของขั้นนี้คือ ผมเห็นมีการใช้ IO ค่อนข้างเยอะมาก แต่ไม่รู้ใครใช้

หลังจากนั้นผมเลยเปลี่ยนโปรแกรม โดยใช้ Process Monitor แทน ซึ่งตัวนี้มีบันทึกการเรียกใช้ File, Registry และอื่นๆ ที่ค่อนข้างละเอียดกว่า แล้วผมก็พบว่ามีการยายามเข้าถึงไฟล์ใน %userprofile%/AppData/Local/Temp/* เยอะมากๆ ซึ่งก็ตรงกับที่ Google ได้มาคือเค้าให้ลดขนาด Home user directory แต่เค้าน่าจะบอกไม่หมดว่าเฉพาะ folder นะ

เพื่อพิสูจน์สมมุติฐาน เนื่องจากไฟล์ที่เข้าถึงอยู่ในโฟลเดอร์ชื่อว่า Temp ดังนั้นจึงน่าจะเป็นไฟล์ที่ไม่สำคัญและลบได้ ซึ่งมีจำนวนทั้งสิ้นมากกว่า 300,000 ไฟล์ (จำไม่ได้ชัดเจน) ผมเลยจัดการลบมันทิ้งทั้งหมดเลย แล้วลอง Sign in ใหม่ และอาการนี้ก็หายไป สามารถ Sign in ได้ใน 3 วินาที

นอกจากนั้นผมยังได้พิสูจน์เพิ่มเติมคือสร้างไฟล์ 200,000 ไปใส่ใน Temp แล้ว Sign out แล้ว Sign in ใหม่ ผลคือใช้เวลาทั้งสิ้น 17 วินาที ซึ่ง และหากเพิ่มเป็น 400,000 ไฟล์ ก็ใช้เวลานานเกิน 30 วินาทีเลยทีเดียว แต่หากย้ายไฟล์ทั้งหมดออกนอก Temp แต่ยังอยู่ใน Local (เช่น %userprofile%/AppData/Local/SomeApp) จะไม่มีผลกับเวลา Sign in (หรืออาจจะมีแต่น้อยกว่า Temp ชนิดที่ผมไม่สังเกตุก็ไม่รู้)

สุดท้ายนี้ งงมากๆว่าตอน Sign in จะไปอ่าน %userprofile%/AppData/Local/Temp ทุกไฟล์ทำเกลืออะไร? มันไม่ควรมีไฟล์สำคัญในนั้นสิ ไม่จำเป็นต้องอ่านทุกครั้งที่ Sign in หรือถ้ามีสำคัญก็ควรจะเป็นแค่ของตัวเองไม่ใช่เหรอ ไม่ใช่ทั้งโฟลเดอร์

อ้อแล้วก็ ไอ้ %userprofile%/AppData/Local/Temp ไม่ถูกลบจาก Disk Cleanup ปกติด้วยนะ ต้องเข้าไปลบเองเท่านั้น เพราะ Disk Cleanup ผมก็ลองแต่แลกแล้วไม่ช่วย (หรือผมอาจจะกดพลาดไปทำให้เผลอไปเอา Temp file ออกก็ไม่น่าใช่อ่ะ)

เป็น Power User แล้วยังต้องลง Anti Virus อยู่ไหม?

เนื่องจากเพื่อนชาวโปรแกรมเมอร์ผมโดนต้องอายัดบัตรเครดิตไป 5 ใบ และใบล่าสุดเพิ่งใช้ไป 2 ที่เลยจับได้ว่ามาจากเว็บของฟินิกซ์ (อ้างอิง1 อ้างอิง2) ซึ่งในช่วงแรกผมบอกเลยตอนโพสแรกเราได้ลองเข้าไปลองเล่นตอนแรกยังไม่นึกว่าจะเป็นการแก้ code ที่ frontend ด้วยซ้ำ ตอนแรกที่เข้าไปดูผมเห็นว่ามีการส่งข้อมูลบัตรขึ้นหาเว็บฟินิกซ์โดยตรง ทั้งๆที่ผมคิดว่าเว็บนั้นน่าจะไม่ผ่าน PCI DSS แต่ตอนแรกคิดว่าเป็น Business requirement ว่าอยากได้เลขบัตรรึเปล่า (เวลารูดซื้อผมเห็นบางร้านเก็บบันทึกเลขบัตร) จนไปเจอว่ามีคนแจ้งว่า Avast มันเจอตั้งแต่ก่อนหน้าวันที่ 30 มกราแล้ว

จากเหตุการณ์นี้ผมจึงคิดว่าจริงๆแล้ว ต่อให้เป็น Power User ก็ยังคงจำเป็นต้องลง Anti Virus อยู่ดี (ถ้าให้พูดตรงๆก็น่าจะเป็นพวก Internet Security หรือ Web Shield มากกว่า) เพราะถึงแม้ว่า Power user อย่างเราจะรู้ตัวว่าทำอะไรดีอยู่แล้ว ทำให้โอกาศติดไวรัสในเครื่องเราค่อนข้างน้อยก็จริง แต่ว่าการป้องกันส่วนนี้ไม่ได้รวมถึงข้อมูลภายนอก เช่นกรณีที่เว็บที่เราเคยเชื่อถือ ถูก hack และแก้ไขให้เป็นภัยกับเราอย่างเช่นเคสนี้เป็นต้น เพราะตามปกติเราไม่ได้ไปตรวจ code ทั้งหมดในเว็บที่เราจะใช้ทุกครั้งก่อนเรากรอกเลขบัตรเครดิต ทำอย่างมากก็แค่ครั้งแรกๆ คงไม่ได้ทำทุกครั้ง เพราะแบบนั้นอาจจะมีการพลาดแบบเคสนี้ได้ การที่มี Anti Virus ในเครื่องอาจจะช่วยเตือนได้ในบางครั้งว่าเว็บนี้แปลกๆแล้วนะ ลองเช็คดูอีกทีไหมว่ายังควรเชื่อถือมันต่อไปหรือไม่

ซึ่งจริงๆแล้วการลง Anti Virus ก็เป็นเพียงแค่การย้ายจากการเชื่อถือเว็บปลายทาง เป็นเชื่อถือ Anti Virus ด้วย เพราะอย่าง Avast ผมเข้าใจว่าการทำงานของ Web Shield ของมันคือการตั้ง Proxy ให้ Browser ทุกตัวมาใช้ ดังนั้นหมายความว่าข้อมูลทุกอย่างเราวิ่งผ่านทาง Anti Virus ถ้าวันไหน Anti Virus เกิดเกลือเป็นหนอนขึ้นมา วันนั้นข้อมูลคุณก็หลุดหมดเลยอยู่ดี แต่ผมว่าโอกาศเกิดมันน้อยกว่าการที่เว็บปลายทางจะถูก hack โดยเราไม่รู้ตัวครับ

รีวิว Backblaze กับ Jottacloud อย่างย่อ

เนื่องจาก FileSystem มีปัญหา (คิดว่าไม่ใช่ HardDisk เพราะ SMART test บอกปกติดี อาจจะเพราะใช้ Windows Storage Space + WSL2 + Window Update ละมั้ง) ทำให้จำเป็นต้องกู้ข้อมูลจาก Cloud มา เลยจะมารีวิวสั้นให้ฟังกันครับ

มารู้จักกับ Backblaze กับ Jottacloud กันก่อน

Backblaze และ Jottacloud เป็นบริการสำรองข้อมูลใน Cloud ที่ราคาค่อนข้างถูก คล้ายๆกับพวก Google Drive, OneDrive หรือ Dropbox แต่มีฟังชั่นต่างๆน้อยกว่า เช่นไม่มีระบบการแชร์ไฟล์ให้คนอื่น หรือระบบ Sync จากโปรแกรมเป็นแบบทางเดียวคือเอาจากเครื่องขึ้น Cloud แต่ไม่ได้เอาจาก Cloud ลงมาบนคอมพิวเตอร์ และข้อดีคือทั้ง 2 บริการเป็นแบบจ่ายคงที่ต่อเดือน แต่ได้ Unlimited Storage คือ ไม่จำกัดขนาดข้อมูลที่เราสามารถสำรองได้ (แต่ Jottacloud เขียนบอกว่าความเร็วการ Upload จะลดลงเมื่อขนาดมากกว่า 5 TB) และมีระบบกู้ไฟล์ที่ถูกลบได้ใน 30 วัน (Backblaze สามารถซื้อเพิ่มได้ในราคา 2 USD / เดือน เพื่อขยายเวลาเป็น 1 ปีได้) มีระบบกู้ข้อมูลไฟล์ที่ถูกแก้ไขได้ (ถ้ามีการแก้ไขไฟล์ทับ สามารถกู้เอาไฟล์ก่อนแก้ไขมาได้)

สาเหตุที่ผมต้องใช้ระบบสำรองข้อมูลอันนี้

เนื่องจากว่าข้อมูลต่างๆของผมนั้นมีความสำคัญ (จริงๆมีแค่บางส่วนแหละ แต่อยากเก็บหมด) จึงไม่อยากให้หายไป ถึงแม้ว่าผมจะทำ RAID 5 เพื่อป้องกัน HardDisk พังไว้แล้ว (จริงๆคือ Windows Storage Space Parity Mode + 3 HardDisk) แต่มันไม่ได้ป้องกันในเรื่องแบบที่ผมกำลังเจอ ณ ตอนนี้คือ FileSystem Corrupted คือมันพังระดับ Software หรือในกรณีที่โดน Ransomware เป็นต้น

จริงๆแล้วเราสามารถใช้ Google Drive, OneDrive หรือ Dropbox แทนได้ แต่หากขนาดข้อมูลเกิน 1 TB แล้วละก็ จะหาที่เก็บได้ยากมากเลยครับ โดยราคารายเดือนจะเป็นตามนี้ครับ (ไม่นับราคา Family เพราะ Account Sync จะมีแค่อันเดียว)

  • Jottacloud ราคาจะอยู่ที่ 9.9 USD ต่อเดือน (เงินไทยประมาณ 350 บาท) ไม่จำกัดขนาด (ฟรี 5 GB ตลอดอายุการใช้งาน)
  • Backblaze ราคาจะอยู่ที่ 6 USD ต่อเดือน (เงินไทยประมาณ 210 บาท) ไม่จำกัดขนาด (มีทดลองใช้ 15 วัน)
  • Google Drive ราคาจะอยู่ที่ 350 บาทต่อเดือน เก็บได้แค่ 2 TB และโดดไป 10 TB ที่ราคา 1750 บาทต่อเดือนเลย
  • OneDrive ราคาอยู่ที่ 209.99 บาทต่อเดือน เก็บได้แค่ 1 TB
  • Dropbox ราคาจะอยู่ที่ 11.99 USD ต่อเดือน (ราคาไทยประมาณ 419.65 บาท) เก็บได้ 2 TB หรือ 19.99 USD ต่อเดือน เก็บได้ 3 TB (ราคาไทยประมาณ 699.65 บาท)

จะเห็นว่าส่วนใหญ่จะได้แค่ประมาณ 1-2 TB เท่านั้น ถ้ามากกว่านั้นจะเริ่มใช้ลำบากทันที เพราะต่อให้ใช้ OneDrive Family Plan ก็ยังมีการจำกัดต่อ Account อยู่อีกที ส่วนอันอื่นที่เดิน 2 TB ก็ราคาโดดไปเลย (จริงๆตอนมาทำเพิ่งเห็นว่า Dropbox มี 3 TB ด้วย)

เรื่องระบบการสำรองข้อมูล

Backblaze

สำหรับ Backblaze นั้นใช้งานค่อนข้างง่าย (มั้ง จำไม่ค่อยได้ครับ 55+) โดยแค่ลงโปรแกรม Sync จากนั้น Login เลือก Drive ที่จำสำรองข้อมูล (ถ้าจำไม่ผิดไม่สามารถเลือก External Harddisk ได้) จากนั้นที่เหลือก็แค่รอระบบค่อยๆอับโหลดขึ้นไปให้ครบก็พอ แต่สิ่งที่ต้องระวังคือการตั้งค่าเริ่มต้นของ Backblaze จะไม่ได้อับโหลดทุกไฟล์ขึ้นไป ต้องเข้าไปในหน้า Setting > Exclusions เพื่อดูรายละเอียดต่างๆ เราสามารถปรับเพิ่มลดได้ ว่าจะไม่สนไฟล์นามสกุลไหนหรือโฟลเดอร์ไหนบ้าง แนะนำให้เช็คในส่วนตั้งค่ายกเว้นนามสกุลนะครับ เพราะถ้าจำไม่ผิดมันจะมี exe, dll, iso อยู่ ซึ่งบางคนอาจจะอยากให้อับโหลดไปด้วย

Jottacloud

สำหรับ Jottacloud นั้นใช้งานง่ายเช่นกัน เหมือน Backblaze เลย ลงโปรแกรม Login แต่สิ่งที่ต่างจาก Backblaze คือโดยเริ่มต้นนั้น Jottacloud จะ ไม่ได้เลือก Drive และโดยเริ่มต้นจะสำรองแค่บางส่วนเท่านั้น ต้องกด Add Folder แล้วเลือก Drive ที่อยากสำรองข้อมูลขึ้นไปแทน โดย Jottacloud สามารถเลือก Exclude subfolder ได้อยู่ (เลือกที่จะไม่สำรองข้อมูลให้กับโฟลอเดอร์ที่เรากำหนด) แต่จะสำรองทุกอย่างที่เราไม่ได้เลือก Exclude ไว้

เรื่องระบบการกู้ข้อมูล

เราพูดถึงการสำรองข้อมูลไปแล้ว ต่อไปพูดถึงเรื่องการกู้คืนบ้าง ซึ่งในส่วนนี้จะพูดถึงแค่วิธีการนะครับ ส่วนประสบการณ์การใช้งานอยู่ด้านล่างนะครับ

Backblaze

การกู้ข้อมูลของ Backblaze มี 4 วิธีคือ

  • Download Zip file โดยระบบจะให้เราดาวโหลดไฟล์ ตามที่เราเลือก โดยขนาดรวมต้อครั้งต้องไม่เกิน 500GB และทำได้พร้อมกันสูงสุดได้ไม่เกิน 5 ไฟล์ เก็บรักษาไว้ 7 วัน
  • Save Files to B2 (zip เหมือนกัน) โดยระบบจะทำการ Upload ไฟล์ไปที่ระบบ B2 (คิดง่ายๆ ก็เหมือนกับ AWS S3 หรือ Space ของ Digitalocean นั่นแหละ) ไม่จำกัดขนาดไฟล์ (มั้่ง) โดยในคู่มือระบุว่าคาดหวังว่าจะได้ความเร็วที่ 1 GB / นาที (แต่มันก็ขึ้นกับขนาดและจำนวนไฟล์) และมีคำแนะนำว่าถ้าขนาดมากกว่า 1 TB แนะนำให้แยกไฟล์ (มีค่าใช้จ่ายในการเก็บไฟล์ และคิดตาม Bandwidth ที่ดาวโหลด)
  • USB Flash Drive ตามชื่อเลยครับ เค้าจะส่ง Flashdrive ขนาดสูงสุด 256 GB แต่มีค่าใช้จ่าย 99 USD ต่อครั้ง ซึ่งสามารถขอคืนได้ ถ้าส่ง Flashdrive คืนใน 30 วันหลังจากได้รับ
  • USB Hard Drive ตามชื่อเหมือนข้อบนเลย เค้าจะส่ง Harddisk มาให้ขนาดสูงสุด 8 TB แต่มีค่าใช้จ่าย 189 USD ต่อครั้ง ซึ่งสามารถขอคืนได้ ถ้าส่ง Harddisk คืนใน 30 วันหลังจากได้รับ

Jottacloud

ข้อมูลตรงนี้อาจจะไม่ครบนะครับ เป็นเท่าที่ผมเห็นมีดังนี้

  • Download ผ่านหน้าเว็บ
  • Download ผ่านทาง App ของมันเอง

สั้นและง่าย ไม่มีอะไรรายละเอียดมากมายนักครับ

ประสบการณ์การกู้ข้อมูล

เนื่องจากผมต้องการกู้ข้อมูลจาก Filesystem มีปัญหา แต่ไฟล์ทั้งหมดมีขนาดใหญ่มาก ประมาณ 2.7 TB เนื่องจากผมไม่รู้ไฟล์ไหนเสียบ้าง เลยต้องโหลดมาหมดเลยจ้า

Backblaze

ตัวเลือกที่ผมจะเลือกตอนแรกคือ Download Zip file แต่ไม่สามารถทำได้เนื่องจากขนาดใหญ่เกิน จึงเลือก Save Files to B2 ต้องยอมรับว่าโง่จริง แทนที่จะเลือกแบ่งดาวโหลด 5 ไฟล์ แล้วเอาเศษนิดหน่อยขึ้น B2 ดันเอาขึ้น B2 หมดเลย เลยต้องเสียค่าใช้จ่ายไปนิดหน่อย

ความเร็วในการดาวโหลดคิดว่าน่าจะใช้ได้เลย (พอดีเนื้อที่ผมไม่พอ เลยไปใช้ Google Compute Engine สำหรับ Download มาก่อน เพื่อเอามาเช็ค CRC32 เทียบกับข้อมูลใน Local อันนี้ก็โง่อีก ผมมี HDD 4 TB ที่เป็นที่เก็บไฟล์ชั่วคราว สำหรับ Build RAID ใหม่จากเหตการณ์นี้) ได้ความเร็วต่อไฟล์ 30 – 50 MBps (B = Bytes) โดยเช็คจากที่ Chrome บอกมานะครับ

แต่ความเร็วในการอับโหลดขึ้น B2 นี่ค่อนข้างช้าเลยครับ ความเร็วเป็นดังต่อไปนี้

  • กด Backup ไฟล์ทั้งหมด ขนาด 2969.2 GB จำนวนไฟล์ 380841 ไฟล์ (ตบมาจาก JSON ที่ API ของ backblaze ส่งมา) สั่งไปตั้งแต่ วันที่ 2020-07-23 เกือบๆเที่ยงคืน จนตอนนี้ 2020-07-28 ยังไม่เสร็จครับ
  • backup1 (เนื่องจากข้างบนรอนานไป เลยแบ่งมันเป็น 3 ไฟล์) ขนาด 1,519.5 GB จำนวนไฟล์ 12514 สั่งไปวันที่ 2020-07-24 เสร็จประมาณ 2020-07-26
  • backup 2 ขนาด 708.2 GB จำนวนไฟล์ 144012 สั่งไปวันที่ 2020-07-24 เสร็จประมาณ 2020-07-25
  • backup 3 ขนาด 476.3 GB จำนวนไฟล์ 224719 สั่งไปวันที่ 2020-07-24 เสร็จประมาณ 2020-07-25

แต่ก็ดันมีปัญหาเกิดขึ้น เนื่องจากครั้งนี้ผมเขียนโปรแกรมสำหรับเทียบไฟล์ที่มีในเครื่องกับที่มีบน Cloud เลยรู้ว่ามันตอนมันเอาไฟล์ใส่ Zip แล้วอับโหลดขึ้น B2 มันอับไฟล์มาไม่ครบ คือในระบบมองเห็นและ Download ได้จากหน้าเว็บ แต่ใน Zip มันไม่มีเฉยเลย (EDIT อาจจะติด maximum path length ของ zip เลยใส่มาไม่ได้ เพราะชื่อไฟล์ยาวเกิน)

สรุปคือตอนกู้ของ Backblaze นี่ค่อนข้างช้า และแย่พอสมควรเลย ไม่แน่ใจว่าถ้าสั่งมาเป็น harddisk จะได้ครบไหมนะครับ

Jottacloud

อันนี้ทำผมสับสนพอสมควรเลย เพราะว่าโปรแกรมมันไม่ได้ Sync เหมือน Google Drive, OneDrive หรือ Dropbox คือผมกด Restore ใน Web Console แล้ว แต่มันไม่ Sync ลงมา ตอนแรกนึกว่าตัวไฟล์บน Cloud ก็พังไปแล้วด้วย แต่จริงๆคือไม่ มันแค่ Restore จาก Trash กลับไปที่บน Cloud แต่ข้อมูลในเครื่องไม่มี

ความเร็วในการกู้ข้อมูลจัดว่าค่อนข้างเร็วเลย ผมใช้โปรแกรมของมันสั่ง Download ไฟล์ไปที่ Harddisk อีกตัว ถ้าเป็นไฟล์ใหญ่ผมได้ความเร็ว 150+ Mbps เลยครับ (อันนี้ใช้เฯ้ตบ้านความเร็ว 200 Mbps มันเลยต่างจากข้างบนที่เอาไปลง Google Cloud) แต่ไฟล์เล็กๆอาจจะช้ากว่านี้ครับ

เพิ่มเติมคือ Jottacloud มีฟีเจอร์นึงที่ดีมากคือถ้าเราลบไฟล์เป็นจำนวนมาก มันจะส่งเมลมาบอก (OneDrive ก็มีถ้าลบไฟล์ใน Cloud เป็นจำนวนมากมันจะส่งเมลบอก แต่เจ้าอื่นไม่แน่ใจ ยังไม่เคยเห็น) ซึ่งผมชอบมากเลย เพราะมันทำให้ผมรู้ว่า Drive D ผมมีความผิดปกติเกิดขึ้นครับ

Commit Charge / Physical Memory / Modified Memory และอื่นๆเกี่ยวกับ Memory Management

พอดีเกิดหาข้อมูลเรื่องนี้นิดหน่อย และคิดว่าน่าสนใจดี เลยขอแปลบันทึกไว้ เป็นความหมายของข้อมูลที่แสดงใน Process Explorer (บางตัวก็แสดงใน Task Manager ด้วย)

  • Commit Charge หรือ Committed ที่แสดงใน Task Manager หมายถึง จำนวนหน่วยความจำที่ถูกจองไว้โดยโปรแกรมทั้งหมด
  • Physical Memory (ไม่แน่ใจว่าคือ In Used หรือ Paged Pool ใน Task Manager) คือจำนวน Memory ที่ถูกใช้ไปจริง ๆ
  • Commit Limited คือจำนวนสูงสุดที่สามารถจอง Memory ได้ (มาจากขนาด RAM + ขนาด Pagefile)
  • Modified คือจำนวน Memory ที่ได้ถูกใช้ในระยะเวลานึง
  • Private Bytes คือจำนวน Memory ที่โปรแกรมขอ OS ไป
  • Working Set คือจำนวน Memory ที่อยู่ใน RAM ของโปรแกรมนั้น

ข้างล่างจะสรุปตามความเข้าใจนะครับ จะทิ้ง Reference ให้ท้ายสุดนะครับ ถ้ามีความรู้ภาษาอังกฤษแนะนำให้ไปอ่านต้นทางดีกว่าครับ เพราะละเอียดและถูกต้องกว่า

คือเมื่อโปรแกรมสั่งจอง Memory ในแบบ Commit ที่ VirtualAlloc จำนวน 2MB จำนวน Commit Charge จะเพิ่มขึ้น 2MB แต่ใน Physical Memory ยังไม่มีการใช้งานจริง จึงไม่เพิ่มขึ้น (อาจจะมีเพิ่มนิดหน่อยจาก Overhead)

ต่อมาเมื่อโปรแกรมได้ทำการเขียนข้อมูลลงบนตำแหน่งที่เราได้จองไว้ข้างต้นจริง ๆ ถึงจะเพิ่มค่า Physical Memory Usage และทำให้ Memory Available ลดลง

ต่อมาถ้าตำแนห่ง memory นั้นไม่ได้ถูกใช้งานเกินระยะเวลานึง และมีความต้องการ RAM จำนวนมาก อาจจะเกิดแบบนี้ขึ้น

  • OS จะนำตำแหน่งนั้นออกจาก Working Set
  • เนื่องจากมันเคยถูกเขียนแล้วมันจะถูกย้ายไป Modified Page list (ถ้าไม่เคยเขียนจะย้ายไป Standby)
  • เมื่อ Modified Page list มากถึงจุดๆนึง จะมีการย้ายข้อมูลลง Pagefile (ถ้ามันมีนะ)
  • ย้ายตำแหน่งนั้นจาก Modifed Page list ไป Standby แทน แต่ข้อมูลต้นฉบับยังอยู่ใน RAM อยู่ พร้อมใช้ได้ทุกเมื่อ ที่จุดนี้ RAM Available จะเพิ่มขึ้น (เพราะมันถือว่าเป็นข้อมูลที่เอาออกจาก RAM ได้แล้ว) และ Working Set จะลดลง
  • ตำแหน่งที่อยู่ใน Standby list สามารถเอากลับมาใช้ได้ทุกเมื่อ
  • ถ้าหากโปรแกรมนั้นพยายามจะใช้ตำแหน่งที่ย้ายไป Modifed หรือ Standby มันจะไปอ่านจาก Disk แล้วนำกลับเข้า RAM และใส่เข้าไปใน Working Set

ถ้าหากไม่มี Pagefile ข้อ 3-5 จะไม่คงอยู่ที่ Modified list และไม่ย้ายไปที่ disk เพราะมันไม่มี

ต้นฉบับ

Reduce Angular bundle size by remove unused locale in moment.js (without ng eject)

This is my lab test for remove a moment locale from angular app. This article will show you how to reduce Angular bundled size by remove unused locale in moment.js without ng eject

WARNING: This is my first english article. I’m not good english but i think this should be share to other people.

Prepare a lab data

Just install Angular 7 and moment by this command.

ng new ng7-moment
cd ng7-moment
npm install --save moment

And edit `app.component.ts` to something like this

import { Component, OnInit } from '@angular/core';
import * as moment from 'moment';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  time: string;

  ngOnInit() {
    this.time = moment().format('MMMM Do YYYY, h:mm:ss a');
  }
}

And build a production bundle with stats json. by

npm run build -- --prod --stats-json

Next i see how many size of moment.js that include to bundle by

webpack-bundle-analyzer dist/ng7-moment/stats.json

And this i a result

Angular bundle with a full locale of moment.js

As you can see total size is around 300KB (Gzipped around 70KB).

First try: Import min edition

After I google for solution i found someone suggest that I can import moment.min.js. That file not include any locale data. So i change code to

import { Component, OnInit } from '@angular/core';
import * as moment from 'moment/min/moment.min.js';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  time: string;

  ngOnInit() {
    this.time = moment().format('MMMM Do YYYY, h:mm:ss a');
  }
}

The bundle size after changed is

Bundle size after import min version of moment.js

Now size is reduce to around 51KB (Gzipped around 16KB). WOW! At first time I think it works. But when I import a locale data like this code.

import { Component, OnInit } from '@angular/core';
import * as moment from 'moment/min/moment.min.js';
import 'moment/locale/th';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  time: string;

  ngOnInit() {
    this.time = moment().format('MMMM Do YYYY, h:mm:ss a');
  }
}

And see a bundled size.

bundle size when import min version of moment.js and import localeAs you see we have 2 moment.js and full locale in bundled (one is full version and another one is min version). And if you import another library that use moment.js like chart.js the size will be like that too.

bundle size after import min version of moment.js and import chart.js

Second try: Use webpack plugins

I search in Google again. I see another solution to eject webpack config and add some plugin to remove locale. But for my personal reason i don’t want to eject angular config, So I will skip this solution for now.

Solution: Remove by Replace locale folders.

I found Angular has a feature that can replace environments file up to version that it build. I think I can use this folder to replace locale folder too. So let try

  1. Create a my locale folder and if you use any locale, copy it to this folder.
    mkdir src/locale
    
    # If you want to use any locale copy it to your locale folder
    cp node_modules/moment/locale/th.js src/locale/
  2. Edit angular.json to replace default locale. file fileReplacements section and add this code like this.
                  "fileReplacements": [
                    {
                      "replace": "src/environments/environment.ts",
                      "with": "src/environments/environment.prod.ts"
                    },
                    {
                      "replace": "node_modules/moment/locale/",
                      "with": "src/locale/"
                    }
                  ],
  3. Build and see a results. (You will see a warning message like “node_modules/moment/locale/af.js” does not exist. But it OK don’t worry it)

The result is

bundle size after remove unused locale.As you can see the size is around 55KB (Gzipped around 17KB) and no other locale except locale that in new locale folder. even if you import chart.js it still not include unused locale too. Like this

Bundle size after remove unused locale and import chart.js

I hope this will be useful. Thanks for reading.