การบันทึกแบบอะซิงโครนัสผ่าน rsyslogd (8) และการเพิ่มบัฟเฟอร์การเขียน


10

ในเว็บไซต์ที่มีปริมาณการใช้งานค่อนข้างสูงซึ่งทำงานในคอนเทนเนอร์เสมือน (VMware) และไม่มีที่เก็บข้อมูลในเครื่องเราจึงสามารถเพิ่มปริมาณงาน (คำขอต่อวินาที) ได้อย่างมีนัยสำคัญโดยเปลี่ยนจากการบันทึกลงในไฟล์บันทึกโดยตรง (ซึ่งอยู่บนrsyslogd

โดยพื้นฐานแล้วเราได้เปลี่ยนจากการบันทึกแบบซิงโครนัสเป็นอะซิงโครนัส คนงานเว็บเซิร์ฟเวอร์เขียนโดยใช้syslog (3)ไปยังบัฟเฟอร์หน่วยความจำบางส่วนและrsyslogd (8)ส่งข้อมูลไปยังไฟล์จริงขนานและตามจังหวะของมันเองดังนั้นกระบวนการจึงไม่บล็อก IO เมื่อทำการบันทึก

จนถึงตอนนี้ดีมาก ปัญหาคือrsyslogd ที่ป้องกันไม่ให้มีการเขียน (เช่นการหยุดทำงานของเครือข่ายชั่วขณะ / เป็นเวลานาน) และบัฟเฟอร์ที่เข้ามาเติมเต็มอย่างรวดเร็ว

คำถามของฉันคือ:

  • ลูกค้าสามารถบล็อกเมื่อเขียนถึงrsyslogdโดยใช้syslog (3) ได้หรือไม่?
  • มีวิธีดูสถิติrsyslogdเช่นบัฟเฟอร์มีขนาดใหญ่ / เต็มหรือไม่
  • มีวิธีเพิ่มขนาดของบัฟเฟอร์ขาเข้าrsyslogdหรือไม่

2
คุณเคยแก้ปัญหานี้หรือไม่? ถ้าเป็นเช่นนั้นฉันจะสนใจอ่านคำตอบของคุณ
djeikyb

1
@djeikyb: ขออภัยไม่ ฉันเห็นความสนใจ (ลงคะแนนในคำถาม) แต่ยังไม่มีใครตอบเลย ดูเหมือนว่าสิ่งนี้ต้องการการดำน้ำของซอร์สโค้ด
arielf

1
คุณไม่ได้พูดว่าเว็บเซิร์ฟเวอร์ใดที่คุณใช้อยู่ บางทีคุณไม่ควรใช้ syslog เลย ตัวอย่างเช่น Apache ใช้ syslog เพื่อบันทึกหรือเพียงแค่เขียนไปยังไฟล์บันทึก การเข้าสู่ระบบฐานข้อมูลเป็นไปได้อีกอย่างหนึ่ง
blujay

คำตอบ:


1

เท่าที่ฉันจำโหมดเริ่มต้นสำหรับคิวข้อความหลักใน rsyslog เป็นอาร์เรย์ขนาดคงที่ มีขีด จำกัด สำหรับองค์ประกอบ 10k หรือมากกว่านั้น ลองเปลี่ยนสิ่งนี้เป็นคิวลิสต์ที่เชื่อมโยงมันควรจัดการกับข้อความของคุณเป็นครั้งคราวซึ่งจะดีขึ้นมาก

ใช่มีFixedArrayและLinkedListเข้าคิว


"ลองเปลี่ยน" ... คุณชัดเจนกว่านี้ไหม? มองที่/etc/rsyslog.conf: ฉันไม่เห็นอะไรเกี่ยวข้องกับประเภทของคิวที่คุณพูดถึง จำเป็นต้องมีการเปลี่ยนแปลงรหัสหรือไม่? สามารถกำหนดค่าเหล่านี้ได้ที่ไหนและอย่างไร ขอบคุณ!
arielf

1

คำตอบสำหรับคำถามแรกของคุณคือ:

ใช่การเรียกไปยัง syslog () กำลังบล็อค อาจเป็นเวลาสั้น ๆ แต่ก็ยังคงมีการโทรแบบซิงโครนัสที่เกี่ยวข้องกับตัวให้คำอธิบายไฟล์ ดูman 3 syslogdetials เพิ่มเติม

เว้นแต่เซิร์ฟเวอร์ของคุณใช้สถาปัตยกรรมและแบบอะซิงโครนัสจะมีการล็อคอยู่เสมอ Thsi สามารถบรรเทาได้ แต่ไม่ตัดออกตัวอย่างเช่นโดยใช้ separatethread สำหรับการบันทึก สำหรับคำถามอีกสองข้อที่ฉันไม่รู้จริงๆ แต่การตรวจสอบซอร์สโค้ด rsyslogd (เช่นเดียวกับคำถามสำหรับตระกูล syslog () ของฟังก์ชัน) เป็นวิธีเดียวที่จะรู้

โดยทั่วไปหากคุณย้ายการบันทึกไปยังเซิร์ฟเวอร์ภายนอกผ่านทาง UDP: 514 "โปรโตคอลเครือข่าย syslog" คุณจะนำความเป็นไปได้ในการสร้างการล็อคไปเกือบเป็นศูนย์ ด้วยข้อเสียเปรียบของการสูญเสียที่เป็นไปได้ของการบันทึกบางอย่างในระหว่างการโหลดสูง

ก่อนอื่นในเซิร์ฟเวอร์ "ที่มา" คุณต้องแน่ใจว่าการบันทึกทั้งหมดเกิดขึ้นผ่าน syslog ตัวอย่างเช่นใน Apache2 คุณต้องระบุ:

ErrorLog "syslog:daemon"

สำหรับเซิร์ฟเวอร์อื่น ๆ โปรดดูที่หน้าคนที่เหมาะสม หากคุณไม่สามารถมั่นใจได้โปรดจำไว้ว่าการเข้าสู่ระบบไฟล์สามารถสร้างได้

ประการที่สองในการกำหนดค่า rsyslogd ดั้งเดิมคุณขอให้นำการรับส่งข้อมูล syslog ทั้งหมดสำหรับสิ่งอำนวยความสะดวกที่คุณเลือก ("daemon" ในตัวอย่างนี้) ไปยังเซิร์ฟเวอร์ syslog ภายนอกหนึ่งเซิร์ฟเวอร์ขึ้นไป ในไฟล์กำหนดค่า rsyslog คุณสามารถระบุ:

daemon.* @192.168.128.1
daemon.* @192.168.254.1

เพื่อให้มีสองชุดของบันทึกที่จะส่งไปยังเซิร์ฟเวอร์ที่แตกต่างกันสองเครื่องในเวลาเดียวกัน

ประการที่สามในเซิร์ฟเวอร์ปลายทางคุณเปิดใช้งานการรับข้อความ syslog ผ่าน UDP: 514 มันอยู่ในไฟล์กำหนดค่า (ปลายทาง) rsyslogd และปกติจะถูกปิดใช้งานโดย defualt (มันเพียงพอที่จะลบ #s นำหน้า:

$ModLoad imudp
$UDPServerRun 514

ประการที่สี่เป็นทางเลือก แต่แนะนำเป็นอย่างยิ่งฉันจะเปิดใช้งานการประทับเวลาความละเอียดสูงด้วย:

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

ตัวเลือกนี้จะถูกปิดใช้งานตามค่าเริ่มต้น (ทำไมบนโลก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.