storaged.cpp revision 3790f5bfafc52ca881b9350b922ffe94e6a537bb
162cb372279f0237f759d3fe8a7e03d8272ba327fynwang/* 262cb372279f0237f759d3fe8a7e03d8272ba327fynwang * Copyright (C) 2016 The Android Open Source Project 362cb372279f0237f759d3fe8a7e03d8272ba327fynwang * 462cb372279f0237f759d3fe8a7e03d8272ba327fynwang * Licensed under the Apache License, Version 2.0 (the "License"); 562cb372279f0237f759d3fe8a7e03d8272ba327fynwang * you may not use this file except in compliance with the License. 662cb372279f0237f759d3fe8a7e03d8272ba327fynwang * You may obtain a copy of the License at 762cb372279f0237f759d3fe8a7e03d8272ba327fynwang * 862cb372279f0237f759d3fe8a7e03d8272ba327fynwang * http://www.apache.org/licenses/LICENSE-2.0 962cb372279f0237f759d3fe8a7e03d8272ba327fynwang * 1062cb372279f0237f759d3fe8a7e03d8272ba327fynwang * Unless required by applicable law or agreed to in writing, software 1162cb372279f0237f759d3fe8a7e03d8272ba327fynwang * distributed under the License is distributed on an "AS IS" BASIS, 1262cb372279f0237f759d3fe8a7e03d8272ba327fynwang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1362cb372279f0237f759d3fe8a7e03d8272ba327fynwang * See the License for the specific language governing permissions and 1462cb372279f0237f759d3fe8a7e03d8272ba327fynwang * limitations under the License. 1562cb372279f0237f759d3fe8a7e03d8272ba327fynwang */ 1662cb372279f0237f759d3fe8a7e03d8272ba327fynwang 1762cb372279f0237f759d3fe8a7e03d8272ba327fynwang#define LOG_TAG "storaged" 1862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 1962cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <stdlib.h> 2062cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <time.h> 2162cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <unistd.h> 2262cb372279f0237f759d3fe8a7e03d8272ba327fynwang 2362cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <android-base/logging.h> 243790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian#include <cutils/properties.h> 2562cb372279f0237f759d3fe8a7e03d8272ba327fynwang 2662cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <storaged.h> 2762cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <storaged_utils.h> 2862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 2962cb372279f0237f759d3fe8a7e03d8272ba327fynwang/* disk_stats_publisher */ 3062cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_publisher::publish(void) { 3162cb372279f0237f759d3fe8a7e03d8272ba327fynwang // Logging 3262cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_perf perf = get_disk_perf(&mAccumulate); 3327506fa41f7b07714b49eb3d36760a2f8c0708d0Jin Qian log_debug_disk_perf(&perf, "regular"); 3462cb372279f0237f759d3fe8a7e03d8272ba327fynwang log_event_disk_stats(&mAccumulate, "regular"); 3562cb372279f0237f759d3fe8a7e03d8272ba327fynwang // Reset global structures 3662cb372279f0237f759d3fe8a7e03d8272ba327fynwang memset(&mAccumulate, 0, sizeof(struct disk_stats)); 3762cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 3862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 3962cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_publisher::update(void) { 4062cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_stats curr; 4162cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (parse_disk_stats(DISK_STATS_PATH, &curr)) { 4262cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_stats inc = get_inc_disk_stats(&mPrevious, &curr); 4362cb372279f0237f759d3fe8a7e03d8272ba327fynwang add_disk_stats(&inc, &mAccumulate); 44af49d9756f8b0e29be517101c83c696031cd1dd9ynwang#ifdef DEBUG 4562cb372279f0237f759d3fe8a7e03d8272ba327fynwang// log_kernel_disk_stats(&mPrevious, "prev stats"); 4662cb372279f0237f759d3fe8a7e03d8272ba327fynwang// log_kernel_disk_stats(&curr, "curr stats"); 4762cb372279f0237f759d3fe8a7e03d8272ba327fynwang// log_kernel_disk_stats(&inc, "inc stats"); 4862cb372279f0237f759d3fe8a7e03d8272ba327fynwang// log_kernel_disk_stats(&mAccumulate, "accumulated stats"); 49af49d9756f8b0e29be517101c83c696031cd1dd9ynwang#endif 5062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mPrevious = curr; 5162cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 5262cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 5362cb372279f0237f759d3fe8a7e03d8272ba327fynwang 5462cb372279f0237f759d3fe8a7e03d8272ba327fynwang/* disk_stats_monitor */ 5562cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::update_mean() { 5662cb372279f0237f759d3fe8a7e03d8272ba327fynwang CHECK(mValid); 5762cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.read_perf = (uint32_t)mStats.read_perf.get_mean(); 5862cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.read_ios = (uint32_t)mStats.read_ios.get_mean(); 5962cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.write_perf = (uint32_t)mStats.write_perf.get_mean(); 6062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.write_ios = (uint32_t)mStats.write_ios.get_mean(); 6162cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.queue = (uint32_t)mStats.queue.get_mean(); 6262cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 6362cb372279f0237f759d3fe8a7e03d8272ba327fynwang 6462cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::update_std() { 6562cb372279f0237f759d3fe8a7e03d8272ba327fynwang CHECK(mValid); 6662cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.read_perf = (uint32_t)mStats.read_perf.get_std(); 6762cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.read_ios = (uint32_t)mStats.read_ios.get_std(); 6862cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.write_perf = (uint32_t)mStats.write_perf.get_std(); 6962cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.write_ios = (uint32_t)mStats.write_ios.get_std(); 7062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.queue = (uint32_t)mStats.queue.get_std(); 7162cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 7262cb372279f0237f759d3fe8a7e03d8272ba327fynwang 7362cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::add(struct disk_perf* perf) { 7462cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.read_perf.add(perf->read_perf); 7562cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.read_ios.add(perf->read_ios); 7662cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.write_perf.add(perf->write_perf); 7762cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.write_ios.add(perf->write_ios); 7862cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.queue.add(perf->queue); 7962cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 8062cb372279f0237f759d3fe8a7e03d8272ba327fynwang 8162cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::evict(struct disk_perf* perf) { 8262cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.read_perf.evict(perf->read_perf); 8362cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.read_ios.evict(perf->read_ios); 8462cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.write_perf.evict(perf->write_perf); 8562cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.write_ios.evict(perf->write_ios); 8662cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.queue.evict(perf->queue); 8762cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 8862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 8962cb372279f0237f759d3fe8a7e03d8272ba327fynwangbool disk_stats_monitor::detect(struct disk_perf* perf) { 9062cb372279f0237f759d3fe8a7e03d8272ba327fynwang return ((double)perf->queue >= (double)mMean.queue + mSigma * (double)mStd.queue) && 9162cb372279f0237f759d3fe8a7e03d8272ba327fynwang ((double)perf->read_perf < (double)mMean.read_perf - mSigma * (double)mStd.read_perf) && 9262cb372279f0237f759d3fe8a7e03d8272ba327fynwang ((double)perf->write_perf < (double)mMean.write_perf - mSigma * (double)mStd.write_perf); 9362cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 9462cb372279f0237f759d3fe8a7e03d8272ba327fynwang 9562cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::update(struct disk_stats* stats) { 9662cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_stats inc = get_inc_disk_stats(&mPrevious, stats); 9762cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_perf perf = get_disk_perf(&inc); 9862cb372279f0237f759d3fe8a7e03d8272ba327fynwang // Update internal data structures 9962cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (LIKELY(mValid)) { 10062cb372279f0237f759d3fe8a7e03d8272ba327fynwang CHECK_EQ(mBuffer.size(), mWindow); 10162cb372279f0237f759d3fe8a7e03d8272ba327fynwang 10262cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (UNLIKELY(detect(&perf))) { 10362cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStall = true; 10462cb372279f0237f759d3fe8a7e03d8272ba327fynwang add_disk_stats(&inc, &mAccumulate); 10527506fa41f7b07714b49eb3d36760a2f8c0708d0Jin Qian log_debug_disk_perf(&mMean, "stalled_mean"); 10627506fa41f7b07714b49eb3d36760a2f8c0708d0Jin Qian log_debug_disk_perf(&mStd, "stalled_std"); 10762cb372279f0237f759d3fe8a7e03d8272ba327fynwang } else { 10862cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mStall) { 10962cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_perf acc_perf = get_disk_perf(&mAccumulate); 11027506fa41f7b07714b49eb3d36760a2f8c0708d0Jin Qian log_debug_disk_perf(&acc_perf, "stalled"); 11162cb372279f0237f759d3fe8a7e03d8272ba327fynwang log_event_disk_stats(&mAccumulate, "stalled"); 11262cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStall = false; 11362cb372279f0237f759d3fe8a7e03d8272ba327fynwang memset(&mAccumulate, 0, sizeof(mAccumulate)); 11462cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 11562cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 11662cb372279f0237f759d3fe8a7e03d8272ba327fynwang 11762cb372279f0237f759d3fe8a7e03d8272ba327fynwang evict(&mBuffer.front()); 11862cb372279f0237f759d3fe8a7e03d8272ba327fynwang mBuffer.pop(); 11962cb372279f0237f759d3fe8a7e03d8272ba327fynwang add(&perf); 12062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mBuffer.push(perf); 12162cb372279f0237f759d3fe8a7e03d8272ba327fynwang 12262cb372279f0237f759d3fe8a7e03d8272ba327fynwang update_mean(); 12362cb372279f0237f759d3fe8a7e03d8272ba327fynwang update_std(); 12462cb372279f0237f759d3fe8a7e03d8272ba327fynwang 12562cb372279f0237f759d3fe8a7e03d8272ba327fynwang } else { /* mValid == false */ 12662cb372279f0237f759d3fe8a7e03d8272ba327fynwang CHECK_LT(mBuffer.size(), mWindow); 12762cb372279f0237f759d3fe8a7e03d8272ba327fynwang add(&perf); 12862cb372279f0237f759d3fe8a7e03d8272ba327fynwang mBuffer.push(perf); 12962cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mBuffer.size() == mWindow) { 13062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mValid = true; 13162cb372279f0237f759d3fe8a7e03d8272ba327fynwang update_mean(); 13262cb372279f0237f759d3fe8a7e03d8272ba327fynwang update_std(); 13362cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 13462cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 13562cb372279f0237f759d3fe8a7e03d8272ba327fynwang 13662cb372279f0237f759d3fe8a7e03d8272ba327fynwang mPrevious = *stats; 13762cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 13862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 13962cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::update(void) { 14062cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_stats curr; 14162cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (LIKELY(parse_disk_stats(DISK_STATS_PATH, &curr))) { 14262cb372279f0237f759d3fe8a7e03d8272ba327fynwang update(&curr); 14362cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 14462cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 14562cb372279f0237f759d3fe8a7e03d8272ba327fynwang 14662cb372279f0237f759d3fe8a7e03d8272ba327fynwang/* emmc_info_t */ 14762cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid emmc_info_t::publish(void) { 14862cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mValid) { 14962cb372279f0237f759d3fe8a7e03d8272ba327fynwang log_event_emmc_info(&mInfo); 15062cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 15162cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 15262cb372279f0237f759d3fe8a7e03d8272ba327fynwang 15362cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid emmc_info_t::update(void) { 15462cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mFdEmmc >= 0) { 15562cb372279f0237f759d3fe8a7e03d8272ba327fynwang mValid = parse_emmc_ecsd(mFdEmmc, &mInfo); 15662cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 15762cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 15862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 15962cb372279f0237f759d3fe8a7e03d8272ba327fynwang/* storaged_t */ 16062cb372279f0237f759d3fe8a7e03d8272ba327fynwangstoraged_t::storaged_t(void) { 16162cb372279f0237f759d3fe8a7e03d8272ba327fynwang mConfig.emmc_available = (access(EMMC_ECSD_PATH, R_OK) >= 0); 16262cb372279f0237f759d3fe8a7e03d8272ba327fynwang 16362cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (access(MMC_DISK_STATS_PATH, R_OK) < 0 && access(SDA_DISK_STATS_PATH, R_OK) < 0) { 16462cb372279f0237f759d3fe8a7e03d8272ba327fynwang mConfig.diskstats_available = false; 16562cb372279f0237f759d3fe8a7e03d8272ba327fynwang } else { 16662cb372279f0237f759d3fe8a7e03d8272ba327fynwang mConfig.diskstats_available = true; 16762cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 16862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 16962cb372279f0237f759d3fe8a7e03d8272ba327fynwang mConfig.proc_taskio_readable = true; 17062cb372279f0237f759d3fe8a7e03d8272ba327fynwang const char* test_paths[] = {"/proc/1/io", "/proc/1/comm", "/proc/1/cmdline", "/proc/1/stat"}; 17162cb372279f0237f759d3fe8a7e03d8272ba327fynwang for (uint i = 0; i < sizeof(test_paths) / sizeof(const char*); ++i) { 17262cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (access(test_paths[i], R_OK) < 0) { 17362cb372279f0237f759d3fe8a7e03d8272ba327fynwang mConfig.proc_taskio_readable = false; 17462cb372279f0237f759d3fe8a7e03d8272ba327fynwang break; 17562cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 17662cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 17762cb372279f0237f759d3fe8a7e03d8272ba327fynwang 178bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian mConfig.proc_uid_io_available = (access(UID_IO_STATS_PATH, R_OK) == 0); 179bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian 1803790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian mConfig.periodic_chores_interval_unit = 1813790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian property_get_int32("ro.storaged.event.interval", DEFAULT_PERIODIC_CHORES_INTERVAL_UNIT); 1823790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 1833790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian mConfig.event_time_check_usec = 1843790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian property_get_int32("ro.storaged.event.perf_check", 0); 1853790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 1863790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian mConfig.periodic_chores_interval_disk_stats_publish = 1873790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian property_get_int32("ro.storaged.disk_stats_pub", DEFAULT_PERIODIC_CHORES_INTERVAL_DISK_STATS_PUBLISH); 1883790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 1893790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian mConfig.periodic_chores_interval_emmc_info_publish = 1903790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian property_get_int32("ro.storaged.emmc_info_pub", DEFAULT_PERIODIC_CHORES_INTERVAL_EMMC_INFO_PUBLISH); 1913790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 1923790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian mUidm.set_periodic_chores_params( 1933790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian property_get_int32("ro.storaged.uid_io.interval", DEFAULT_PERIODIC_CHORES_INTERVAL_UID_IO), 1943790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian property_get_int32("ro.storaged.uid_io.threshold", DEFAULT_PERIODIC_CHORES_UID_IO_THRESHOLD)); 19562cb372279f0237f759d3fe8a7e03d8272ba327fynwang 19662cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStarttime = time(NULL); 19762cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 19862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 19962cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid storaged_t::event(void) { 20062cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mConfig.diskstats_available) { 20162cb372279f0237f759d3fe8a7e03d8272ba327fynwang mDiskStats.update(); 20262cb372279f0237f759d3fe8a7e03d8272ba327fynwang mDsm.update(); 20362cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mTimer && (mTimer % mConfig.periodic_chores_interval_disk_stats_publish) == 0) { 20462cb372279f0237f759d3fe8a7e03d8272ba327fynwang mDiskStats.publish(); 20562cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 20662cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 20762cb372279f0237f759d3fe8a7e03d8272ba327fynwang 208a1740cbaa4ba9dff6ec2e9045c08ba56edf8e492Jin Qian#ifdef DEBUG 20962cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mConfig.proc_taskio_readable) { 21062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mTasks.update_running_tasks(); 21162cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 212a1740cbaa4ba9dff6ec2e9045c08ba56edf8e492Jin Qian#endif 21362cb372279f0237f759d3fe8a7e03d8272ba327fynwang 21462cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mConfig.emmc_available && mTimer && 21562cb372279f0237f759d3fe8a7e03d8272ba327fynwang (mTimer % mConfig.periodic_chores_interval_emmc_info_publish) == 0) { 21662cb372279f0237f759d3fe8a7e03d8272ba327fynwang mEmmcInfo.update(); 21762cb372279f0237f759d3fe8a7e03d8272ba327fynwang mEmmcInfo.publish(); 21862cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 21962cb372279f0237f759d3fe8a7e03d8272ba327fynwang 220bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian if (mConfig.proc_uid_io_available && mTimer && 221bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian (mTimer % mUidm.get_periodic_chores_interval()) == 0) { 222bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian mUidm.report(); 223bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian } 224bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian 22562cb372279f0237f759d3fe8a7e03d8272ba327fynwang mTimer += mConfig.periodic_chores_interval_unit; 226af49d9756f8b0e29be517101c83c696031cd1dd9ynwang} 2273790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2283790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qianvoid storaged_t::event_checked(void) { 2293790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian struct timespec start_ts, end_ts; 2303790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian bool check_time = true; 2313790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2323790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian if (mConfig.event_time_check_usec && 2333790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_ts) < 0) { 2343790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian check_time = false; 2353790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian PLOG_TO(SYSTEM, ERROR) << "clock_gettime() failed"; 2363790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian } 2373790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2383790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian event(); 2393790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2403790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian if (mConfig.event_time_check_usec) { 2413790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_ts) < 0) { 2423790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian PLOG_TO(SYSTEM, ERROR) << "clock_gettime() failed"; 2433790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian return; 2443790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian } 2453790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian int64_t cost = (end_ts.tv_sec - start_ts.tv_sec) * SEC_TO_USEC + 2463790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian (end_ts.tv_nsec - start_ts.tv_nsec) / USEC_TO_NSEC; 2473790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian if (cost > mConfig.event_time_check_usec) { 2483790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian LOG_TO(SYSTEM, ERROR) 2493790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian << "event loop spent " << cost << " usec, threshold " 2503790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian << mConfig.event_time_check_usec << " usec"; 2513790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian } 2523790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian } 2533790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian} 254