මෙය සිදුවන්නේ සජීවී අගුලක් නිසා ntpd විසින් adjtimex (2) අමතා කර්නලයට පිම්ම තත්පරයට ඇතුළු කරන ලෙස පවසමිනි. Lkml පළ කිරීම බලන්න http://lkml.indiana.edu/hypermail/linux/kernel/1203.1/04598.html
Red Hat ද ඔවුන්ගේ KB ලිපිය යාවත්කාලීන කළ යුතුය. https://access.redhat.com/knowledge/articles/15145
යාවත්කාලීන කිරීම: Red Hat හි දෙවන KB ලිපියක් මෙහි ඇත: https://access.redhat.com/knowledge/solutions/154713 - පෙර ලිපිය කලින් සම්බන්ධ නොවූ ගැටළුවක් සඳහා ය
වැඩ කිරීම යනු ntpd ක්රියා විරහිත කිරීමයි. Ntpd දැනටමත් adjtimex (2) ඇමතුම නිකුත් කර ඇත්නම්, ඔබට ntpd අක්රීය කර 100% ආරක්ෂිත වීමට නැවත පණගැන්විය යුතුය.
මෙය RHEL 6 ට බලපාන අතර අළුත් කර්නල් ධාවනය වන අනෙකුත් ඩිස්ට්රෝ (දළ වශයෙන් 2.6.26 ට වඩා අළුත්), නමුත් RHEL 5 නොවේ.
පිම්ම තත්පරයට සැබවින්ම සිදුවීමට පෙර මෙය සිදුවීමට හේතුව නම් , මධ්යම රාත්රියේදී පිම්ම දෙවන වරට හැසිරවීමට ntpd මඟින් කර්නලයට ඉඩ ලබා දීමයි, නමුත් මධ්යම රාත්රියට පෙර දෙවන පිම්ම ඇතුල් කිරීමට කර්නලයට අනතුරු ඇඟවීම අවශ්ය වේ. එනිසා පිම්ම තත්පරයට දිවා කාලයේදී යම් වේලාවක adjtimex (2) අමතයි, එම අවස්ථාවේදී මෙම දෝෂය අවුලුවන.
ඔබ adjtimex (8) ස්ථාපනය කර ඇත්නම්, 16 වන ධජය සකසා තිබේද යන්න තීරණය කිරීමට ඔබට මෙම ස්ක්රිප්ට් භාවිතා කළ හැකිය. ධජය 16 යනු “පිම්ම දෙවනුව ඇතුල් කිරීම”:
adjtimex -p | perl -p -e 'undef $_, next unless m/status: (\d+)/; (16 & $1) && print "leap second flag is set:\n"'
යාවත්කාලීන කිරීම:
Red Hat ඔවුන්ගේ KB ලිපිය යාවත්කාලීන කර ඇත: "NTP පිම්ම තත්පර නිවේදනය ලැබීමේදී එන්එම්අයි වොච්ඩෝග් එල්ලා වැටීමක් හඳුනා ගැනීමට හේතු වන දන්නා ගැටළුවක් නිසා RHEL 6 ගනුදෙනුකරුවන්ට බලපෑම් ඇතිවිය හැකිය. මෙම ගැටළුව කාලෝචිත ආකාරයකින් විසඳනු ලැබේ. පිම්ම තත්පර නිවේදනය සහ මෙම ගැටළුව අත්විඳ නැති නිසා ඒවා තවදුරටත් බලපෑමට ලක් නොවේ.
යාවත්කාලීන කිරීම: ඉහත භාෂාව Red Hat ලිපියෙන් ඉවත් කරන ලදි; adjtimex (2) බිඳ වැටීමේ ගැටලුව විස්තර කරමින් දෙවන KB විසඳුමක් එකතු කරන ලදි: https://access.redhat.com/knowledge/solutions/154713
කෙසේ වෙතත්, අයිබීඑම් ඉංජිනේරු ජෝන් ස්ටුල්ට්ස් විසින් එල්කේඑම්එල් පෝස්ට් එකේ කේත වෙනස් කිරීම සටහන් කරන්නේ පිම්ම තත්පරයට සත්ය වශයෙන්ම යොදන විට ද අවහිරයක් ඇති විය හැකි බැවින් එන්ටීපීඩී අක්රීය කිරීමෙන් පසු ඇඩ්ටයිමෙක්ස් (8) නැවත ආරම්භ කිරීමෙන් හෝ පිම්ම දෙවනුව අක්රීය කිරීමට ඔබට අවශ්ය විය හැකිය.
අවසාන යාවත්කාලීන කිරීම:
හොඳයි, මම කර්නල් දේව් නොවේ, නමුත් මම නැවත මෙහි ජෝන් ස්ටුල්ට්ස්ගේ පැච් සමාලෝචනය කළෙමි: https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git; a = commit; h = 6b43ae8a619d17c4935c3320d2ef9e92bdeed05d
මම මේ වතාවේ එය නිවැරදිව කියවනවා නම්, පිම්ම තත්පරයට යොදන විට තවත් අවහිරයක් ඇතිවීම වැරදිය. එය ඔවුන්ගේ කේබී ප්රවේශය මත පදනම්ව Red Hat ගේ මතය ද බව පෙනේ. කෙසේ වෙතත්, ඔබ ntpd අක්රීය කර ඇත්නම්, එය තවත් විනාඩි 10 ක් අක්රීය කර තබන්න, එවිට ntpd adjtimex (2) අමතන විට ඔබ අවහිරයට පත් නොවනු ඇත.
තවත් දෝෂ තිබේදැයි අපි ඉක්මනින් සොයා බලමු :)
POST-LEAP දෙවන යාවත්කාලීන කිරීම:
මම පසුගිය පැය කිහිපය ගත කළේ ntpd සහ pre-patch (දෝෂ සහිත) කර්නල් කේතය හරහා වන අතර, මම මෙහි ඉතා වැරදියි අතර, මම සිතන්නේ කුමක්දැයි පැහැදිලි කිරීමට උත්සාහ කරමි:
පළමුව, ntpd සෑම විටම adjtimex (2) අමතයි. එය මෙය කරන්නේ එහි "ඔරලෝසු ලූප් ෆිල්ටරයේ" කොටසක් වන අතර එය ntp_loopfilter.c හි local_clock හි අර්ථ දක්වා ඇත. ඔබට එම කේතය මෙහි දැකිය හැකිය: http://www.opensource.apple.com/source/ntp/ntp-70/ntpd/ntp_loopfilter.c (ntp වෙළුම 4.2.6 සිට).
ඔරලෝසු ලූප් ෆිල්ටරය බොහෝ විට ක්රියාත්මක වේ - එය එන්ටීපීඩී එහි උඩුමහලේ සේවාදායකයන් ඡන්දය දෙන සෑම අවස්ථාවකම ක්රියාත්මක වන අතර පෙරනිමියෙන් සෑම මිනිත්තු 17 ක් හෝ ඊට වැඩි වේ. ඔරලෝසු ලූප් ෆිල්ටරයේ අදාළ බිට්:
if (sys_leap == LEAP_ADDSECOND)
ntv.status |= STA_INS;
ඊළගට:
ntp_adjtime(&ntv)
වෙනත් වචන වලින් කිවහොත්, තත්පරයට පිම්මක් ඇති දිනවල, ntpd "STA_INS" ධජය සකසා adjtimex (2) අමතයි (එහි අතේ ගෙන යා හැකි-එතීම හරහා).
එම පද්ධති ඇමතුම කර්නලය වෙතට ගමන් කරයි. අදාළ කර්නල් කේතය මෙන්න: https://github.com/mirrors/linux/blob/a078c6d0e6288fad6d83fb6d5edd91ddb7b6ab33/kernel/time/ntp.c
කර්නල් කෝඩ්පාත් දළ වශයෙන් මෙයයි:
- 663 වන පේළිය - do_adjtimex චර්යාවේ ආරම්භය.
- පේළිය 691 - පවතින ඕනෑම පිම්ම-තත්පර ටයිමරයක් අවලංගු කරන්න.
- 709 වන පේළිය - ntp_lock spinlock අල්ලා ගන්න (මෙම අගුල සිදුවිය හැකි සජීවී බිඳවැටීමට සම්බන්ධ වේ)
- 724 වන පේළිය - අමතන්න process_adjtimex_modes.
- පේළිය 616 - ඇමතුම් ක්රියාවලිය_අජ්_ස්ටැටස්.
- පේළිය 590 - adjtimex (2) ඇමතුමෙහි ඇති කොඩි මත පදනම්ව time_status ගෝලීය විචල්යය සකසන්න
- පේළිය 592 - time_state ගෝලීය විචල්යය පරීක්ෂා කරන්න. බොහෝ අවස්ථාවලදී, ntp_start_leap_timer අමතන්න.
- පේළිය 554 - time_status ගෝලීය විචල්යය පරීක්ෂා කරන්න. STA_INS සකසනු ඇත, එබැවින් කාල වේලාව TIME_INS ලෙස සකසා පිම්ම දෙවන ටයිමරය ආරම්භ කිරීම සඳහා hrtimer_start (තවත් කර්නල් ශ්රිතයක්) අමතන්න. ටයිමරයක් නිර්මාණය කිරීමේ ක්රියාවලියේදී, මෙම කේතය xtime_lock අල්ලා ගනී. වෙනත් CPU එකක් දැනටමත් xtime_lock සහ ntp_lock අල්ලාගෙන සිටියදී මෙය සිදුවන්නේ නම්, කර්නලය සජීවී අගුළු දමයි. ජෝන් ස්ටුල්ට්ස් පැච් ලිවූයේ හර්ටිමර් භාවිතා නොකිරීමටයි. අද සෑම දෙනාටම කරදර ඇති කළේ මෙයයි.
- පේළිය 598 - ntp_start_leap_timer ඇත්ත වශයෙන්ම පිම්ම ටයිමරයක් ආරම්භ නොකළේ නම්, වේලාව_ස්ථානය TIME_OK ලෙස සකසන්න
- 751 වන පේළිය - කර්නලය සජීවීව නොපවතින බව උපකල්පනය කර, තොගය නිරුපද්රිතව ඇති අතර ntp_lock spinlock මුදා හරිනු ලැබේ.
මෙහි රසවත් දේවල් කිහිපයක් තිබේ.
පළමුවෙන්ම, 691 වන පේළිය ඇඩ්ටයිටෙක්ස් (2) කැඳවන සෑම අවස්ථාවකම පවතින ටයිමරය අවලංගු කරයි. 554 එම ටයිමරය නැවත නිර්මාණය කරයි. මෙයින් අදහස් කරන්නේ ntpd සිය ඔරලෝසු ලූප් ෆිල්ටරය ධාවනය කරන සෑම අවස්ථාවකම දෝෂ සහිත කේතය ක්රියාත්මක කරන බවයි.
ඒ නිසා මම විශ්වාස කරනවා රෙඩ් හැට් වැරදියි කියලා කිව්වහම වරක් එන්පීපීඩී පිම්ම දෙවන ධජය සකසා ගත්තොත් පද්ධතිය බිඳ වැටෙන්නේ නැහැ. පිම්ම තත්පරයට පෙර පැය 24 ක කාලය තුළ සෑම මිනිත්තු 17 කට වරක් (හෝ ඊට වැඩි) සජීවීව ක්රියා කිරීමට ntpd ධාවනය වන සෑම පද්ධතියකටම හැකියාවක් ඇතැයි මම විශ්වාස කරමි. බොහෝ පද්ධති බිඳවැටීමට හේතුවද මෙය පැහැදිලි කරනු ඇතැයි මම විශ්වාස කරමි; පැයකට අවස්ථා 3 ක් සමඟ සසඳන විට එක් වරකදී අනතුරට පත්වීමේ අවස්ථාව අඩු වේ.
යාවත්කාලීන කිරීම: https://access.redhat.com/knowledge/solutions/154713 හි Red Hat හි KB විසඳුමේදී , Red Hat ඉංජිනේරුවන් එකම නිගමනයකට පැමිණියේය (ntpd ධාවනය කිරීම දෝෂ සහිත කේතයට අඛණ්ඩව පහර දෙන බව). ඇත්තෙන්ම ඔවුන් මා එසේ කිරීමට පැය කිහිපයකට පෙර එසේ කළා. මෙම විසඳුම https://access.redhat.com/knowledge/articles/15145 හි ප්රධාන ලිපියට සම්බන්ධ නොවීය , එබැවින් මම මේ දක්වා එය දුටුවේ නැත.
දෙවනුව, පටවන ලද පද්ධති බිඳ වැටීමට වැඩි ඉඩක් ඇත්තේ මන්දැයි මෙයින් පැහැදිලි වේ. පටවා ඇති පද්ධති වැඩි බාධා කිරීම් හසුරුවනු ඇති අතර එමඟින් "do_tick" කර්නල් ක්රියාකාරිත්වය බොහෝ විට කැඳවනු ඇත, මෙම කේතය ටයිමරය නිර්මාණය කරන අතරතුර ntp_lock ක්රියාත්මක කිරීමට සහ අල්ලා ගැනීමට වැඩි අවස්ථාවක් ලබා දෙයි.
තෙවනුව, පිම්ම තත්පරයට සැබවින්ම සිදුවන විට පද්ධතිය බිඳ වැටීමේ අවස්ථාවක් තිබේද? මම නිශ්චිතවම නොදනිමි, නමුත් සමහර විට ඔව්, මන්දයත් පිම්ම තත්පරයට ගැලපීම සිදු කරන ටයිමරය (ntp_leap_second, 388 වන පේළියේ) ද ntp_lock spinlock අල්ලාගෙන hrtimer_add_expires_ns වෙත ඇමතුමක් ලබා දී ඇති බැවිනි. එම ඇමතුමට සජීවී අගුලක් ඇති කළ හැකිදැයි මම නොදනිමි, නමුත් එය කළ නොහැකි බවක් නොපෙනේ.
අවසාන වශයෙන්, පිම්ම තත්පර ධාවනය වූ පසු පිම්ම දෙවන ධජය අක්රීය කිරීමට හේතුව කුමක්ද? Ntpd හි ඇති පිළිතුර මධ්යම රාත්රියෙන් පසුව යම් වේලාවක පිම්ම දෙවන ධජය සැකසීම නවත්වයි. ධජය සකසා නොමැති බැවින්, 554 වන පේළියේ චෙක්පත සත්ය නොවන අතර ටයිමරයක් සාදනු නොලැබේ, සහ 598 වන පේළිය time_state ගෝලීය විචල්යය TIME_OK වෙත නැවත සකසනු ඇත. පිම්ම තත්පරයට පසුව ඔබ ධජය adjtimex (8) සමඟ පරීක්ෂා කළහොත්, පිම්ම-දෙවන ධජ කට්ටලය ඔබට තවමත් පෙනෙන්නේ මන්ද යන්න මෙයින් පැහැදිලි වේ.
කෙටියෙන් කිවහොත්, අද දවසේ හොඳම උපදෙස් මම සියල්ලට පසු දුන් පළමු අවස්ථාව ලෙස පෙනේ: ntpd අක්රීය කරන්න, සහ පිම්ම දෙවන ධජය අක්රීය කරන්න.
සහ අවසාන සිතුවිලි කිහිපයක්:
- ලිනක්ස් වෙළෙන්දන් කිසිවෙකු ජෝන් ස්ටුල්ට්ස්ගේ පැච් එක දැක එය ඔවුන්ගේ කර්නල් වලට යොදන ලදි :(
- මෙය අවශ්ය වූ සමහර වෙළෙන්දන් ගැන ජෝන් ස්ටුල්ස් අනතුරු ඇඟවූයේ නැත්තේ ඇයි? සමහර විට සජීවී ශබ්දය අවලංගු කිරීමට තරම් අඩු බවක් පෙනෙන්නට තිබුණි.
- පිම්ම තත්පරයට යොදන විට ජාවා ක්රියාවලි අගුලු දැමීම හෝ භ්රමණය වීම පිළිබඳ වාර්තා මා අසා ඇත. සමහර විට අපි ගූගල්ගේ නායකත්වය අනුගමනය කර අපගේ පද්ධති වෙත පිම්ම තත්පරයට යොදන ආකාරය ගැන නැවත සිතා බැලිය යුතුය: http://googleblog.blogspot.com/2011/09/time-technology-and-leaping-seconds.html
06/02 ජෝන් ස්ටුල්ට්ස් වෙතින් යාවත්කාලීන කිරීම:
https://lkml.org/lkml/2012/7/1/203
සීපී යූ භාරය ඉහළ නංවමින් ෆියුටෙක්ස් ටයිමරයන් අකාලයේ හා අඛණ්ඩව කල් ඉකුත්වීමට හේතුව පිම්ම තත්පරයට හේතු වූයේ කුමක්ද යන්න පිළිබඳ පියවරෙන් පියවර ඇවිදීමේ පෝස්ට් එකෙහි අඩංගු විය.