ನಮ್ಮ ಸರ್ವರ್ಗಳನ್ನು ಹೆಪ್ಪುಗಟ್ಟಿಸಿದ ಕಾಣೆಯಾಗಿದ್ದ ಸ್ವಾಪ್ ಫೈಲ್
ಸೆಪ್ಟೆಂಬರ್ 24ರಂದು, ನಮ್ಮ ಒಂದು ಪ್ರೊಡಕ್ಷನ್ ಸರ್ವರ್ ಉತ್ತರಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿತು. ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ ಆ ಸರ್ವರ್ ಅನ್ನು ಅನಾರೋಗ್ಯಕರ ಎಂದು ಗುರುತಿಸಿತು ಮತ್ತು ನಮ್ಮ ರಿಮೋಟ್-ಕಮಾಂಡ್ ಟೂಲ್ ಅದನ್ನು ತಲುಪಲಾಗಲಿಲ್ಲ — ಆದರೆ ಯಾವುದೂ ಕ್ರ್ಯಾಶ್ ಆಗಿರಲಿಲ್ಲ ಮತ್ತು ಹೆಚ್ಚು ಮೆಮೊರಿ ಬಳಸಿದ್ದಕ್ಕಾಗಿ ಯಾವುದೂ ಕೊಲ್ಲಲ್ಪಟ್ಟಿರಲಿಲ್ಲ. ಸರ್ವರ್ ಥ್ರ್ಯಾಶಿಂಗ್ ಆಗುತ್ತಿತ್ತು: ಸ್ವಾಪ್ ಸ್ಥಳವಿಲ್ಲದೆ ಮತ್ತು ಕಂಟೇನರ್ಗಳು ಯಂತ್ರದಲ್ಲಿದ್ದುದಕ್ಕಿಂತ ಹೆಚ್ಚು ಮೆಮೊರಿ ಬಳಸಲು ಅವಕಾಶ ಪಡೆದಿದ್ದರಿಂದ, ಲಿನಕ್ಸ್ ತನಗೆ ಬೇಕಾದ ಫೈಲ್ಗಳನ್ನು ಹೊರಹಾಕುವುದರಲ್ಲಿ ಮತ್ತು ಮತ್ತೆ ಓದುವುದರಲ್ಲಿ ಸಮಯ ಕಳೆಯುತ್ತಿತ್ತು, ಮತ್ತು ಬಹುತೇಕ ಯಾವ ಪ್ರಗತಿಯೂ ಆಗುತ್ತಿರಲಿಲ್ಲ. ಪ್ರತಿ ಸರ್ವರ್ನಲ್ಲಿ 2 GB ಸ್ವಾಪ್ ಫೈಲ್ ಸೇರಿಸಿದ ನಂತರ ಸಮಸ್ಯೆ ಬಗೆಹರಿಯಿತು. ಇನ್ನೂ ಆಸಕ್ತಿದಾಯಕ ಪಾಠ ಹೆಲ್ತ್ ಚೆಕ್ಗಳ ಬಗ್ಗೆ ಇತ್ತು.
“ಹೆಪ್ಪುಗಟ್ಟುವುದು” ಹೇಗೆ ಕಾಣುತ್ತಿತ್ತು
- ಆ ಸರ್ವರ್ನಲ್ಲಿ ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ನ ಹೆಲ್ತ್ ಚೆಕ್ಗಳು ಟೈಮ್ ಔಟ್ ಆದವು.
- AWS Systems Manager ಮೂಲಕ ಕಳುಹಿಸಿದ ಕಮಾಂಡ್ಗಳು “Pending” ಸ್ಥಿತಿಯಲ್ಲಿ ಉಳಿದು ಎಂದಿಗೂ ಚಲಿಸಲಿಲ್ಲ.
- ಲಾಗ್ಗಳಲ್ಲಿ ಯಾವುದೇ ಔಟ್-ಆಫ್-ಮೆಮೊರಿ ಕಿಲ್ ಇರಲಿಲ್ಲ. ಯಾವ ಪ್ರೊಸೆಸ್ ಕೂಡ ಸತ್ತಿರಲಿಲ್ಲ.
ಒಂದು ವಾರದ ಮೊದಲು ನಾವು ಪ್ರೊಡಕ್ಷನ್ ಅನ್ನು ತಲಾ 2 GB RAM ಇರುವ ಚಿಕ್ಕ ARM ಸರ್ವರ್ಗಳಿಗೆ ಸ್ಥಳಾಂತರಿಸಿದ್ದೆವು. ನಮ್ಮ ಸ್ಟೇಜಿಂಗ್ ಸರ್ವರ್ — ಇನ್ನೂ ಚಿಕ್ಕದು — ಡೆಪ್ಲಾಯ್ ಸಮಯದಲ್ಲಿ ಕಂಟೇನರ್ ಇಮೇಜ್ ಅನ್ನು ಅನ್ಪ್ಯಾಕ್ ಮಾಡುತ್ತಿದ್ದಾಗ ಅದೇ ರೀತಿ ಹೆಪ್ಪುಗಟ್ಟಿತ್ತು.
ಮೆಮೊರಿ ದೋಷ ಏಕೆ ಇರಲಿಲ್ಲ?
ಲಿನಕ್ಸ್ ಒಂದು ಪ್ರೊಸೆಸ್ ಅನ್ನು ಕೊಲ್ಲುವುದು ಅದು ಮರುಪಡೆಯಬಹುದಾದ ಮೆಮೊರಿ ನಿಜವಾಗಿಯೂ ಖಾಲಿಯಾದಾಗ ಮಾತ್ರ. ಅದಕ್ಕಿಂತ ಮೊದಲು, ಅದು ಪೇಜ್ ಕ್ಯಾಶ್ ನಿಂದ ಮೆಮೊರಿಯನ್ನು ಮರುಪಡೆಯುತ್ತದೆ — ಅಂದರೆ RAM ನಲ್ಲಿ ಇಡುವ ಫೈಲ್ಗಳ ಪ್ರತಿಗಳು, ಚಲಿಸುತ್ತಿರುವ ಪ್ರತಿ ಪ್ರೋಗ್ರಾಂನ ಕೋಡ್ ಸೇರಿದಂತೆ.
ನಮ್ಮ ಸರ್ವರ್ಗಳಲ್ಲಿ, ಕಂಟೇನರ್ಗಳ ಸಂಯುಕ್ತ ಮೆಮೊರಿ ಮಿತಿಗಳು ಸುಮಾರು 3.3 GB ಆಗುತ್ತಿದ್ದವು, ಆದರೆ ಯಂತ್ರದಲ್ಲಿ ಬಳಸಬಹುದಾದ ಮೆಮೊರಿ ಸುಮಾರು 1.8 GB ಮಾತ್ರ. ಸಾಮಾನ್ಯವಾಗಿ ಎಲ್ಲವೂ ತಮ್ಮ ಮಿತಿಯನ್ನು ಒಂದೇ ಸಮಯದಲ್ಲಿ ಬಳಸುವುದಿಲ್ಲ. ಆದರೆ ಬಳಸಿದಾಗ, ಕರ್ನಲ್ ಕ್ಯಾಶ್ನಿಂದ ಪ್ರೋಗ್ರಾಂ ಕೋಡ್ ಅನ್ನು ಹೊರಹಾಕುತ್ತಲೇ ಇತ್ತು, ಮತ್ತು ಆ ಕೋಡ್ ಮತ್ತೆ ಚಲಿಸಿದ ತಕ್ಷಣ ಅದನ್ನು ಡಿಸ್ಕ್ನಿಂದ ಮತ್ತೆ ಓದಬೇಕಿತ್ತು. ಈ ಚಕ್ರ — ಥ್ರ್ಯಾಶಿಂಗ್ — ತಾಂತ್ರಿಕವಾಗಿ ಮೆಮೊರಿ ಖಾಲಿಯಾಗದೆಯೇ ಯಂತ್ರವನ್ನು ಬಹುತೇಕ ಸ್ಪಂದಿಸದಂತೆ ಮಾಡಬಲ್ಲದು. ಆದ್ದರಿಂದ ಏನೂ ಕೊಲ್ಲಲ್ಪಡುವುದಿಲ್ಲ, ಮತ್ತು ಏನೂ ಚೇತರಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ.
ಸ್ವಾಪ್ ಇಲ್ಲದಿದ್ದರೆ, ಕರ್ನಲ್ಗೆ ಹಂಚಲಾಗಿದ್ದ ಆದರೆ ಅಪರೂಪವಾಗಿ ಬಳಸುವ ಮೆಮೊರಿಯನ್ನು ಇಡಲು ಜಾಗವಿಲ್ಲ, ಆದ್ದರಿಂದ ಅದನ್ನು ಕ್ಯಾಶ್ನಿಂದಲೇ ತೆಗೆದುಕೊಳ್ಳಬೇಕಾಗುತ್ತದೆ.
ಪರಿಹಾರ
ಸರ್ವರ್ ಬೂಟ್ಸ್ಟ್ರ್ಯಾಪ್ ಸ್ಕ್ರಿಪ್ಟ್ ಈಗ ಪ್ರತಿ ಬಾರಿ ಸರ್ವರ್ ಬೂಟ್ ಆದಾಗ ಅಥವಾ ರಿಪೇರಿಯಾದಾಗ 2 GB ಸ್ವಾಪ್ ಫೈಲ್ ಅನ್ನು ಕಡಿಮೆ ಸ್ವಾಪ್ನೆಸ್ (10) ಸೆಟ್ಟಿಂಗ್ನೊಂದಿಗೆ ರಚಿಸುತ್ತದೆ. ಕಡಿಮೆ ಸ್ವಾಪ್ನೆಸ್ ಎಂದರೆ ಕರ್ನಲ್ ಇನ್ನೂ ಕೆಲಸ ಮಾಡುವ ಮೆಮೊರಿಯನ್ನು RAM ನಲ್ಲಿ ಇಡಲು ಆದ್ಯತೆ ನೀಡುತ್ತದೆ, ಆದರೆ ಅಪರೂಪವಾಗಿ ಮುಟ್ಟುವ ಪುಟಗಳು ಡಿಸ್ಕ್ಗೆ ಹೋಗಬಹುದು — ಪ್ರೋಗ್ರಾಂ ಕೋಡ್ ಅನ್ನು ಕ್ಯಾಶ್ನಿಂದ ಹೊರಹಾಕುವ ಬದಲು. ನಾವು ಇದನ್ನು ಎರಡೂ ಪ್ರೊಡಕ್ಷನ್ ಸರ್ವರ್ಗಳು ಮತ್ತು ಸ್ಟೇಜಿಂಗ್ನಲ್ಲಿ ನೇರವಾಗಿ ಅನ್ವಯಿಸಿದ್ದೇವೆ, ಮತ್ತು ಪ್ರತಿ ಪ್ರೊಡಕ್ಷನ್ ಡೆಪ್ಲಾಯ್ನಲ್ಲಿ ಡೆಪ್ಲಾಯ್ ಪೈಪ್ಲೈನ್ ಬೂಟ್ಸ್ಟ್ರ್ಯಾಪ್ ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಮತ್ತೆ ಪ್ರಕಟಿಸುವುದರಿಂದ ಬದಲಿಸಿದ ಸರ್ವರ್ ಕೂಡ ಅದನ್ನು ಪಡೆಯುತ್ತದೆ.
ನಮಗೆ ಹೆಚ್ಚು ಚಿಂತೆ ತಂದ ಭಾಗ: ಅನಾರೋಗ್ಯಕರ ಸರ್ವರ್ ಉಳಿದುಕೊಂಡಿತ್ತು
ನಮ್ಮ ಸರ್ವರ್ ಗ್ರೂಪ್ EC2 ಹೆಲ್ತ್ ಚೆಕ್ಗಳನ್ನು ಬಳಸುತ್ತಿತ್ತು — “ಯಂತ್ರ ಚಾಲನೆಯಲ್ಲಿದೆಯೇ?” — ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ ಹೆಲ್ತ್ ಚೆಕ್ಗಳನ್ನು ಅಲ್ಲ — “ವಿನಂತಿಗಳಿಗೆ ಉತ್ತರಿಸುತ್ತಿದೆಯೇ?”. ಆದ್ದರಿಂದ ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ ಕೈಬಿಟ್ಟಿದ್ದ ಸರ್ವರ್ ಕೂಡ ಗ್ರೂಪ್ನ ದೃಷ್ಟಿಯಲ್ಲಿ ಆರೋಗ್ಯಕರವಾಗಿತ್ತು. ಅದನ್ನು ಎಂದಿಗೂ ಬದಲಿಸಲಾಗುತ್ತಿರಲಿಲ್ಲ. ಯಾರಾದರೂ ಗಮನಿಸಿ ಇನ್ನೊಂದನ್ನು ರೀಬೂಟ್ ಮಾಡುವವರೆಗೆ ಪ್ರೊಡಕ್ಷನ್ ಸದ್ದಿಲ್ಲದೆ ಒಂದೇ ಸರ್ವರ್ನಲ್ಲಿ ಚಲಿಸುತ್ತಿತ್ತು.
ಗ್ರೂಪ್ ಅನ್ನು ಲೋಡ್-ಬ್ಯಾಲೆನ್ಸರ್ ಹೆಲ್ತ್ ಚೆಕ್ಗಳಿಗೆ ಬದಲಿಸುವುದು ಸ್ಪಷ್ಟ ಪರಿಹಾರದಂತೆ ತೋರಿದರೂ, ನಮಗೆ ಅದು ಸರಳವಲ್ಲ: ಡೆಪ್ಲಾಯ್ ಸಮಯದಲ್ಲಿ ಸರ್ವರ್ಗಳು ಬೇಕೆಂದೇ ತಮ್ಮ ಹೆಲ್ತ್ ಎಂಡ್ಪಾಯಿಂಟ್ಗೆ ದೋಷದೊಂದಿಗೆ ಉತ್ತರಿಸುತ್ತವೆ, ಇದರಿಂದ ಬ್ಯಾಲೆನ್ಸರ್ ಅವುಗಳನ್ನು ಖಾಲಿ ಮಾಡುತ್ತದೆ (ಶೂನ್ಯ 502ಗಳಿಗೆ ಡೆಪ್ಲಾಯ್ಗಳನ್ನು ಹೇಗೆ ತಂದೆವು ನೋಡಿ). ಆ ಸಂಕೇತದ ಮೇಲೆ ಸರ್ವರ್ಗಳನ್ನು ಬದಲಿಸುವ ಗ್ರೂಪ್ ಪ್ರತಿ ಡೆಪ್ಲಾಯ್ ಮಧ್ಯದಲ್ಲಿ ಅವುಗಳನ್ನು ಬದಲಿಸುತ್ತಿತ್ತು.
ಆದ್ದರಿಂದ ಸದ್ಯಕ್ಕೆ ನಾವು ನಮ್ಮ ಡೆಪ್ಲಾಯ್ ಚೆಕ್ಲಿಸ್ಟ್ಗೆ ಒಂದು ಹಂತ ಸೇರಿಸಿದ್ದೇವೆ: ಪ್ರತಿ ಡೆಪ್ಲಾಯ್ ನಂತರ, ಡೆಪ್ಲಾಯ್ ಜಾಬ್ ಪಾಸ್ ಆಯಿತೇ ಎಂದು ಮಾತ್ರವಲ್ಲ, ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ನಲ್ಲಿ ಪ್ರತಿ ಟಾರ್ಗೆಟ್ನ ಹೆಲ್ತ್ ಅನ್ನು ಪರಿಶೀಲಿಸಬೇಕು. ಯಾವುದೇ ಸರ್ವರ್ಗೆ ಕಮಾಂಡ್ಗಳು “Pending” ನಲ್ಲಿ ಉಳಿದರೆ, ಅದು ಥ್ರ್ಯಾಶಿಂಗ್ ಆಗುತ್ತಿದೆ — ಅದನ್ನು ರೀಬೂಟ್ ಮಾಡಿ; ಅದು ಈಗಾಗಲೇ ಸೇವೆಯಿಂದ ಹೊರಗಿದೆ.
ನಾವು ಇದರಿಂದ ಕಲಿತದ್ದು
- “ಕ್ರ್ಯಾಶ್ ಆಗದಿರುವುದು” ಎಂದರೆ “ಆರೋಗ್ಯಕರ” ಅಲ್ಲ. ಥ್ರ್ಯಾಶಿಂಗ್ ಯಾವುದೇ ದೋಷ ತೋರಿಸುವುದಿಲ್ಲ; ಯಂತ್ರ ಉತ್ತರಿಸುವುದನ್ನೇ ನಿಲ್ಲಿಸುವಷ್ಟು ತೀವ್ರ ನಿಧಾನವನ್ನು ಮಾತ್ರ ತೋರಿಸುತ್ತದೆ.
- ಚಿಕ್ಕ ಸರ್ವರ್ಗಳಿಗೆ ಸ್ವಾಪ್ ಬೇಕು. ಕಡಿಮೆ ಸ್ವಾಪ್ನೆಸ್ನೊಂದಿಗೆ ಸ್ವಲ್ಪವೇ ಇದ್ದರೂ, ಕರ್ನಲ್ಗೆ ತಣ್ಣಗಿರುವ ಮೆಮೊರಿ ಇಡಲು ಜಾಗ ಸಿಗುತ್ತದೆ.
- ಯಂತ್ರಕ್ಕಿಂತ ಹೆಚ್ಚಾಗುವ ಮೆಮೊರಿ ಮಿತಿಗಳು ಒಂದು ಪಂತ. ಕೆಲವೊಮ್ಮೆ ನೀವು ಅದನ್ನು ಸೋಲುತ್ತೀರಿ. ಯಾವಾಗ ಪಂತ ಕಟ್ಟಿದ್ದೀರಿ ಎಂದು ತಿಳಿದಿರಲಿ.
- ನಿಮ್ಮ ಆಟೋಸ್ಕೇಲಿಂಗ್ ಯಾವ ಹೆಲ್ತ್ ಚೆಕ್ ಅನ್ನು ನಂಬುತ್ತದೆ ಎಂದು ತಿಳಿಯಿರಿ. “ವರ್ಚುವಲ್ ಮೆಷಿನ್ ಆನ್ ಇದೆಯೇ?” ಎಂದು ಮಾತ್ರ ಕೇಳುವ ಹೆಲ್ತ್ ಚೆಕ್ ಕೆಲಸ ನಿಲ್ಲಿಸಿದ ಸರ್ವರ್ ಅನ್ನು ಬದಲಿಸುವುದಿಲ್ಲ.