เหตุใดจึงใช้เวลานับสิบวินาทีในการรับ shell prompt


30

มันเป็นเหตุการณ์ปกติที่หลังจาก SSHing ไปยังเซิร์ฟเวอร์ (หรือเปิดเทอร์มินัลบน Mac ของฉัน) แบนเนอร์ล็อกอินจะพิมพ์ทันที แต่จะใช้เวลาประมาณ 10 วินาทีถึงหนึ่งนาทีเพื่อให้เชลล์แจ้งให้ปรากฏ หลังจากนั้นประสิทธิภาพจะดีและเวลาแฝงของเครือข่ายไม่ผิดปกติ

สิ่งนี้ดูเหมือนจะไม่ยากกับการคำนวณหน่วยความจำมากหรืองานหนัก IO มันทำอะไรกับซีพียูหลายพันล้านรอบทั้งหมด


8
ssh -v -v -vและur_shell -xอาจเป็นขั้นตอนการดีบักที่รอบคอบ
thrig

2
มีหลายบรรทัดในของคุณ.bash_history?
kasperd

2
ดูไฟล์. profile และไฟล์ที่เกี่ยวข้องของคุณ (ขออภัยไม่แน่ใจว่าคุณใช้เชลล์ตัวใด) และลบชั่วคราวเพื่อดูว่าสิ่งที่ปรับปรุงนั้นดีขึ้นหรือไม่ คุณอาจมีคำสั่งที่หมดเวลา
TheFiddlerWins

3
อีกทางเลือกหนึ่งสำหรับข้อเสนอแนะของ Moby Disk มันยังช้าพอ ๆ กันถ้าคุณเริ่มเชลล์เองจากภายในเชลล์หรือไม่? ถ้ามันช้าเมื่อเชื่อมต่ออีกครั้ง แต่เร็วเมื่อเริ่มเชลล์ที่สองจากภายในเซสชันที่เชื่อมต่อที่มีอยู่นั่นจะบอกคุณว่าไม่ใช่เชลล์ที่ทำให้เกิดความช้า ถ้ามันช้าพอ ๆ กันในสองสถานการณ์ดังนั้นสิ่งที่เชลล์ทำเมื่อเริ่มต้นใช้เวลานาน ทั้งสองวิธีนี้คุณจะได้เรียนรู้เกี่ยวกับแง่มุมของ "จากศูนย์ถึงเชลล์พร้อมท์" ซึ่งช้า
CVn

2
บ่อยครั้งที่นี่คือการตรวจสอบสิทธิ์ GSSAPI ที่พยายามจะเกิดขึ้น (ซึ่งหากคุณไม่ใช่ร้านค้า Kerberos ก็ไม่มีประโยชน์อย่างสมบูรณ์) บางครั้งมันเป็น DNS reverse lookups
Charles Duffy

คำตอบ:


33

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

โอกาสที่ปัญหาของคุณจะทวีความรุนแรงมากขึ้น

หากโปรไฟล์หรือ bashrc ของคุณมีสิ่งที่มีราคาแพงให้พิจารณาการตัดแต่งกลับ

หากโปรไฟล์หรือ bashrc ของคุณใช้การค้นหา DNS ย้อนกลับ (เพื่อตั้งค่าพรอมต์หรือบางอย่าง) ให้แก้ไข DNS หรือใช้ชื่อโฮสต์แทน

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

หากแบนเนอร์คือการรับรองความถูกต้องล่วงหน้าอาจเป็นจริงรับรองความถูกต้อง (pam, LDAP, ฯลฯ ) ที่ช้า

มันอาจจะไม่ใช่สิ่งเหล่านี้เลย จำนวนสิ่งที่น่าแปลกใจเกิดขึ้นก่อนที่จะแสดงข้อความแจ้ง!


1
อีกอันหนึ่งที่ฉันเคยเห็นบล็อกมาเป็นระยะเวลานานคือพยายามตรวจสอบสิทธิ์ GSSAPI (หากไม่ได้ปิดใช้งานการกำหนดค่าไคลเอ็นต์ SSH หรือเซิร์ฟเวอร์) การใช้เครื่องมือการติดตามแบบเต็มระบบเช่น sysdig อาจเป็น bullet เงินที่ดีที่สุดที่มีให้เพื่อไปที่ด้านล่างของปัญหาการข้ามความกังวลเช่นนี้
Charles Duffy

+1 คำตอบอย่างละเอียด ไซต์นี้มีแผนผังลำดับงานที่ดีสำหรับการเข้าสู่ระบบไฟล์ใดที่พวกเขาเรียกใช้ / แหล่งที่มาและข้อมูลอื่น ๆ
ทิมเอส

15
+1 99% ของเวลาสำหรับฉันมันคือการค้นหา DNS ย้อนกลับ
mpontillo

@ ไมค์: เหมือนกันที่นี่ - ฉันขอแนะนำให้เริ่มต้นด้วยอันนี้เพราะมันง่ายที่จะแก้ไข ในกรณีของฉัน 100%
WoJ

22

อาจกำลังรอ DNS หรือพยายามตรวจสอบสิทธิ์ผ่าน LDAP หรือ

ลองเพิ่มUseDNS noใน / etc / ssh / sshd_config

หากใช้บนโลคัลล็อกออนให้ตรวจสอบว่าเซิร์ฟเวอร์ LDAP หรือเซิร์ฟเวอร์ DNS ใด ๆ ที่คุณกำหนดค่าไว้ทำงานช้าหรือไม่ตอบสนอง


6

ความเป็นไปได้อย่างหนึ่ง (ที่ครอบคลุมโดยคำตอบอื่น ๆ ) คือกระบวนการของการตั้งค่าเซสชัน SSH นั้นเป็นที่ที่เวลาหายไป

อีกทางเลือกหนึ่งคือสคริปต์การเริ่มต้นเชลล์ของคุณทำงานบนเครื่องระยะไกลหลังจากการสร้างเซสชัน SSH มีบางสิ่งที่ใช้เวลานาน (อาจพยายามเข้าถึงการเชื่อมต่อเครือข่ายบางส่วนที่เสียหาย) คุณสามารถดีบักความเป็นไปได้ที่สองนี้ดังนี้:

เพิ่มสิ่งต่อไปนี้ชั่วคราวที่ด้านบนของคุณ~/.bash_profile:

set -x
PS4='+ $(date "+%s.%N")\011 '

การset -xเปิดการดีบักบางอย่างสำหรับทุกคำสั่งเชลล์ดำเนินการ PS4ควบคุมตัวแปรวิธีการแก้จุดบกพร่องที่นำเสนอ - โดยเฉพาะในกรณีนี้เราจะใช้dateเพื่อเพิ่มการประทับเวลา

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


1
เป็นจริงถ้าหากปัญหาเกิดขึ้นหลังจากเปิดเซสชันระยะไกล สาเหตุที่เป็นไปได้หลายอย่างเกิดขึ้นระหว่างการจับมือ SSH และการตรวจสอบความถูกต้อง
Charles Duffy

2
ปรับปรุงมาก :)
Charles Duffy

3

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

$ ssh localhost 
Welcome to Ubuntu 15.04 (GNU/Linux 3.19.0-26-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

*** System restart required ***
Last login: Sat Sep 12 01:38:38 2015 from localhost

ในการสร้างข้อความว่า "จำเป็นต้องรีสตาร์ท" ต้องตรวจสอบว่าเคอร์เนลที่รันอยู่ในปัจจุบันไม่ใช่เคอร์เนลเริ่มต้นที่ติดตั้งอยู่ในปัจจุบัน (เช่นมีเคอร์เนลและฉันยังไม่รีบูต) มันจะพิมพ์จำนวนการปรับปรุงความปลอดภัยที่มีถ้ามี

ฉันคิดว่านี่เป็นการชะลอตัวครั้งใหญ่ในการเข้าสู่ระบบ Ubuntu ที่เพิ่งเปิดตัว

ถ้าไม่เช่นนั้นแสดงว่าคุณ~/.bash_profile/ ~/.bashrcอาจมีปัญหา

คุณลองลงชื่อเข้าใช้เซิร์ฟเวอร์จากตัวเอง ( ssh localhost) หรือยัง หรือเข้าสู่ระบบในครั้งที่ 2 ทันทีหรือไม่ (เพื่อดูว่ามันเร็วกว่านี้ไหมหากมีแคชอยู่)


2

นี่เป็นกรณีส่วนใหญ่การหมดเวลาของคำขอ DNS

สาเหตุ: เซิร์ฟเวอร์พยายามค้นหา DNS ย้อนกลับโดยใช้ที่อยู่ IP ของไคลเอ็นต์และไม่ได้รับคำตอบ ถ้า A เชื่อมต่อกับ B, B พยายามแปลงที่อยู่ IP ของ A เป็นชื่อ

วิธีแก้ปัญหา: ป้อนที่อยู่ IP และชื่อของไคลเอ็นต์ไปยังไฟล์โฮสต์ของเซิร์ฟเวอร์

โซลูชัน: ทำให้โฮสต์ทั้งหมดรู้จักเซิร์ฟเวอร์ DNS

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