Node.js ની એવી બગ (bug) જે તમારા મોનિટરિંગમાં દેખાતી નથી
તમારું હેલ્થ ચેક કહે છે કે બધું બરાબર છે. તે માત્ર એક મિલિસેકન્ડ લે છે. પછી ટ્રાફિક વધે છે. અચાનક, તમારો p99 લેટન્સી (latency) 400ms સુધી પહોંચી જાય છે. તમે તમારા ડેશબોર્ડ્સ જુઓ છો. બધું લીલું (green) દેખાય છે.
CPU વપરાશ મધ્યમ છે. ઇવેન્ટ લૂપ લેગ (Event loop lag) સ્થિર છે. મેમરી હેલ્ધી છે. તમારું APM એક ધીમી રિક્વેસ્ટ બતાવે છે પરંતુ તે શા માટે છે તે વિશે કંઈ કહેતું નથી. કોઈ ધીમી ડેટાબેઝ કોલ્સ નથી. કોઈ એરર (errors) નથી.
સમય libuv થ્રેડ પૂલમાં (thread pool) ખર્ચાય છે.
સ્ટાન્ડર્ડ Node observability ઇવેન્ટ લૂપ પર ધ્યાન કેન્દ્રિત કરે છે. પૂલ એક અલગ ક્યુ (queue) છે. તે તમારી પહોંચની બહાર છે.
Node ઇવેન્ટ લૂપ પર JavaScript ચલાવે છે. તે ભારે કાર્યોને libuv થ્રેડ પૂલમાં મોકલે છે. આમાં શામેલ છે:
- Filesystem કાર્ય (fs.readFile, fs.writeFile).
- Crypto કાર્યો (bcrypt, scrypt, pbkdf2).
- Compression (zlib gzip, deflate).
- DNS lookups (dns.lookup).
પૂલ ડિફોલ્ટ તરીકે માત્ર ચાર થ્રેડ્સ ધરાવે છે. તમારી મશીનમાં ગમે તેટલા CPU કોર્સ હોય, આ વાત સાચી છે.
ચાર થ્રેડ્સ પૂરતા નથી. પૂલ કઈ રીતે નિષ્ફળ જાય છે તેના ત્રણ રસ્તાઓ અહીં છે:
લોગિન વખતે Bcrypt. એક સિંગલ bcrypt hash 250ms લઈ શકે છે. જો ચાર લોકો એકસાથે લોગિન કરે, તો બધા સ્લોટ્સ ભરાઈ જાય છે. પાંચમો વ્યક્તિ ક્યુમાં રાહ જુએ છે. તેમને શરૂ કરવા માટે જ 250ms લાગે છે. તમારી લેટન્સી બમણી થઈ જાય છે.
મોટા gzip ઓપરેશન્સ. મોટા રિસ્પોન્સને કોમ્પ્રેસ કરવાથી પૂલ સ્લોટ રોકાય છે. જો ચાર રિક્વેસ્ટ એકસાથે આવું કરે, તો બાકીના દરેક કાર્યએ રાહ જોવી પડે છે. DNS lookups અને ફાઇલ રીડ્સ લાઈનમાં અટકી જાય છે.
DNS lookups. મોટાભાગની Node એપ્સ dns.lookup નો ઉપયોગ કરે છે. આ એક બ્લોકિંગ સિસ્ટમ કોલનો ઉપયોગ કરે છે. તે કાર્યને પૂલમાં મૂકે છે. જો તમારા નેટવર્કમાં કોઈ સમસ્યા આવે, તો આ lookups આખા પૂલને અટકાવી દે છે.
પૂલ ક્યુમાં અટકેલી રિક્વેસ્ટ અદ્રશ્ય હોય છે. તે CPU નો ઉપયોગ કરી રહી નથી. તે JavaScript ચલાવી રહી નથી. તે ફક્ત પાર્ક થયેલી છે.
તેને કેવી રીતે શોધવું:
જો લોડ હેઠળ તમારી p99 લેટન્સી વધે છે પરંતુ ઇવેન્ટ લૂપ લેગ સ્થિર રહે છે, તો પૂલ તપાસો.
સૌથી ઝડપી ટેસ્ટ: UV_THREADPOOL_SIZE વધારો. તમારા એન્વાયરમેન્ટમાં તેને 64 પર સેટ કરો અને રીસ્ટાર્ટ કરો. જો લેટન્સી ઘટે છે, તો તમને સમસ્યા મળી ગઈ છે.
તેને યોગ્ય રીતે કેવી રીતે ઠીક કરવું:
- bcrypt જેવા ભારે crypto માટે worker_threads નો ઉપયોગ કરો. આ તેમને libuv પૂલથી દૂર રાખશે.
- dns.lookup ને બદલે dns.resolve નો ઉપયોગ કરો. તે એક સાચો async resolver છે.
- સ્લોટ્સ ઝડપથી મુક્ત કરવા માટે zlib કાર્ય માટે streams નો ઉપયોગ કરો.
- તમારા મુખ્ય રિક્વેસ્ટ પાથ પર ભારે filesystem કાર્ય ટાળો.
તમારા યુઝર્સ રાહ જોતા હોય ત્યારે લીલા ડેશબોર્ડ્સ સામે જોવાનું બંધ કરો.
Source: https://dev.to/r9v/the-nodejs-bug-thats-invisible-to-your-monitoring-oo8
