人氣點閱:16867
發表人
閏秒 (leap second) 對於 Windows & Linux 系統的影響 2015-01-12 16:26
/ / /
閏秒 (leap second) 對於 Windows Server, Windows 7 & Linux 系統的影響
「閏秒」的英文:
=> 閏秒英文 leap second (自轉造成)
=> 閏年英文 leap year (公轉造成)
閏秒的原理
=> 地球自轉並不穩定,會受月球潮汐之摩擦力及季節性等因素影響,國際上是以基態銫原子躍遷為準之「國際原子時」(International Atomic Time, TAI)為標準時間尺度。
為使一般民眾生活習慣之世界時能與國際原子時相符合,科學家將國際原子時加上閏秒,稱為世界協調時(Coordinated Universal Time, UTC),作為最終之國際時間標準和原子鐘計時的誤差等因素。
需要每隔幾年「根據實驗數據人為調整(通常是增加) 」,沒有一定公式可以判斷。
通常最近幾年都是 +1 秒。
Ref: 經濟部標準檢驗局 (2012年): http://www.bsmi.gov.tw/bsmiGIP/wSite/ct?xItem=42611&ctNode=4052&mp=1
最近的閏秒調整 2012/2015
通常在 6/30 or 12/31 的 23:59:59 時調整(UTC+0000),59 秒後,下一秒是「神奇的」 60 秒,最後才是 00:00:00
2012 年是在 06/30 23:59:59 調整
2015 年是在 06/30 23:59:59 調整
對於 +8000 的台灣、香港、中國大陸,以及 +9000 日本、韓國來說
就會是 2015/07/01 早上七點五十九分、八點五十九分調整:
e.g.
(GMT+8) 07:59:59 -> 07:59:60 -> 08:00:00
(GMT+9) 08:59:59 -> 08:59:60 -> 09:00:00
閏秒造成的系統問題:舉例一「收費系統」
代碼:
# cat php_leap_second.php
假設程式是這樣寫的
這段程式 or PHP API 本身沒有處理好閏秒,
可能要想辦法用 EPOCH UNIT timestamp 避開此問題,而非使用 Wallclock string
<?PHP
$t1 = new DateTime('2012-06-30T23:59:59UTC');
$t2 = new DateTime('2012-06-30T23:59:60UTC');
$t3 = new DateTime('2012-07-01T00:00:00UTC');
$t4 = new DateTime('2012-07-01T00:00:01UTC');
print_r( $t2->diff($t1) );
print_r( $t3->diff($t1) );
print_r( $t3->diff($t2) );
print_r( $t4->diff($t2) );
?>
# php --version
PHP 5.5.9-1ubuntu4.5 (cli) (built: Oct 29 2014 11:59:10)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
# php php_leap_second.php
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 0
[h] => 0
[i] => 0
[s] => 1
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 1
[days] => 0
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 0
[h] => 0
[i] => 0
[s] => 1
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 1
[days] => 0
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 0
[h] => 0
[i] => 0
[s] => 0 <---------- !!!!!!!! NO DIFF !!!!!!!!!!
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 0
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 0
[h] => 0
[i] => 0
[s] => 1
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 1
[days] => 0
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
閏秒造成的系統問題:舉例二「Log Parser/Analytics」
你的 Log Parser/Analytics 可能沒辦法處理閏秒,因為這一天是 86401 秒
導致 report 產生、平均或標準化的計算等,發生問題。
不過這應該還好。
Linux 對於閏秒的作法
理論上 Linux kernel 3.3 以前的有這個 bug(系統有跑 NTP client),
59:60 會直接造成 kernel stall 或其他症狀
但 2012 年就應該已經修復完畢。
=> http://serverfault.com/questions/403732/anyone-else-experiencing-high-rates-of-linux-server-crashes-during-a-leap-second
如果你的 Linux 系統沒有升級,或者你有擔心的話,
可在 2015/6/30 日,把系統的 NTP client 關閉,
改成吃系統的 RTC,等到 2015/07/01 中午 12:00 之後再改回來。
或者,
選擇 NTP Server 會餵你 59:59 --> 59:59 --> 00:00 的 (e.g. 下列提到的 Google)
微軟 Windows 7, Vista, Server 2008/2003 的 Time Service的作法
=> http://support.microsoft.com/kb/909614/en-us
微軟 Windows 7/Vista/Server 2003/2008 的作法比較直接類似 workaorund ,
Client 端不管 NTP 給你的 59:60 ,就直接快一秒(或者慢一秒)給你;
也就是沒有 59:60,
直接給你 00:00(==59:60) & 00:01(==00:00) 等到下次 time sync 再校正
3. Google NTP Server 對於閏秒的作法: Leap Smear
=> http://googleblog.blogspot.tw/2011/09/time-technology-and-leaping-seconds.html
Google 的作法類似微軟也是 workaround bypass 59:60,但更為「溫和漸進一點」
Google 是透過一個公式,緩慢的把要加入的這一秒(或要扣除的這一秒)慢慢放到 NTP server 上:
@ 在 6/30 or 12/31 這一天,
透過緩慢的「塗抹 Smear + 欺騙 Lie」,把這一秒數切割成 ms 慢慢加上去(或者減掉)
最後 59:59 的時候,這一秒就加完(扣完)。
公式如下
代碼:
lie(t) = (1.0 - cos(pi * t / w)) / 2.0
leap-second-085960-jp.jpg
________________
美術插畫設計案子報價系統 v0.1 Beta
爪哇禾雀
Type
繪圖畫廊 設計藝廊 攝影相簿 留言板 最愛收藏 分類標籤
暱稱: Type 註冊: 2002-11-30 發表: 11174 來自: vovo2000.com
V幣: 901763
Type
繪圖畫廊 設計藝廊 攝影相簿 留言板 最愛收藏 分類標籤
暱稱: Type 註冊: 2002-11-30 發表: 11174 來自: vovo2000.com
V幣: 901763