Skip to content

Commit

Permalink
Add ITT instrumentation for slab and cuckoo (#238)
Browse files Browse the repository at this point in the history
To build pelikan with ITT instrumentation you should have the Intel®
VTune™Amplifier installed and source the amplxe-vars.sh.
Run cmake with the -DHAVE_ITT_INSTRUMENTATION=yes option.

Co-authored-by: Michal Biesek <michal.biesek@intel.com>
Co-authored-by: Piotr Balcer <piotr.balcer@intel.com>
  • Loading branch information
3 people authored and Yao Yue committed Aug 1, 2019
1 parent 52648ec commit d5849d3
Show file tree
Hide file tree
Showing 12 changed files with 252 additions and 0 deletions.
12 changes: 12 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ option(HAVE_RUST "build features written in rust" OFF)
option(RUST_USE_MUSL "build rust deps against musl" OFF)
option(BUILD_AND_INSTALL_CHECK "build our own version of check and link against it" OFF)
option(USE_PMEM "build persistent memory features" OFF)
option(HAVE_ITT_INSTRUMENTATION "instrument code with ITT API" OFF)

option(COVERAGE "code coverage" OFF)

Expand Down Expand Up @@ -160,6 +161,17 @@ if (USE_PMEM)
link_directories(${LIBPMEM_LIBRARY_DIRS})
endif(USE_PMEM)

if (HAVE_ITT_INSTRUMENTATION)
if(PKG_CONFIG_FOUND)
pkg_check_modules(ITTNOTIFY REQUIRED ittnotify>=1.0)
else()
find_package(ITTNOTIFY REQUIRED 1.0)
endif()
include_directories(${ITTNOTIFY_INCLUDE_DIRS})
link_directories(${ITTNOTIFY_LIBRARY_DIRS})
link_libraries(${ITTNOTIFY_LIBRARIES})
endif(HAVE_ITT_INSTRUMENTATION)

find_package(Threads)

if(TARGET_CDB)
Expand Down
65 changes: 65 additions & 0 deletions cmake/FindITTNOTIFY.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# ITTNOTIFY is the instrumentation and tracing technology (ITT) APIs provided by
# the Intel® VTune™Amplifier enable your application to generate and control
# the collection of trace data during its execution.
#
# The following variables are set when ITTNOTIFY is found:
# ITTNOTIFY_FOUND = Set to true, if all components of ITTNOTIFY have been found.
# ITTNOTIFY_INCLUDE_DIRS = Include path for the header files of ITTNOTIFY.
# ITTNOTIFY_LIBRARY_DIRS = Library search path for the ITTNOTIFY libraries.
# ITTNOTIFY_LIBRARIES = Link these to use ITTNOTIFY.
# ITTNOTIFY_LFLAGS = Linker flags (optional).

if (NOT ITTNOTIFY_FOUND)

find_program(VTUNE_EXECUTABLE amplxe-cl)

if(NOT VTUNE_EXECUTABLE)
set(ITTNOTIFY_FOUND false)
return()
endif()

get_filename_component(VTUNE_DIR ${VTUNE_EXECUTABLE} PATH)
set(ITTNOTIFY_ROOT_DIR "${VTUNE_DIR}/..")

##_____________________________________________________________________________
## Check for the header files

find_path (ITTNOTIFY_INCLUDE_DIRS
NAMES ittnotify.h
HINTS ${ITTNOTIFY_ROOT_DIR}
PATHS /usr /usr/local
PATH_SUFFIXES include
)

##_____________________________________________________________________________
## Check for the library

find_library (ITTNOTIFY_LIBRARIES ittnotify
HINTS ${ITTNOTIFY_ROOT_DIR}
PATHS /usr /usr/local /opt/local
PATH_SUFFIXES lib64 lib
)

##_____________________________________________________________________________
## Actions taken when all components have been found

find_package_handle_standard_args (ITTNOTIFY DEFAULT_MSG ITTNOTIFY_LIBRARIES ITTNOTIFY_INCLUDE_DIRS)

if (ITTNOTIFY_FOUND)
if (NOT ITTNOTIFY_FIND_QUIETLY)
message (STATUS "Found components for ITTNOTIFY")
message (STATUS "ITTNOTIFY_ROOT_DIR = ${ITTNOTIFY_ROOT_DIR}")
message (STATUS "ITTNOTIFY_INCLUDE_DIRS = ${ITTNOTIFY_INCLUDE_DIRS}")
message (STATUS "ITTNOTIFY_LIBRARIES = ${ITTNOTIFY_LIBRARIES}")
endif (NOT ITTNOTIFY_FIND_QUIETLY)
else (ITTNOTIFY_FOUND)
if (ITTNOTIFY_FIND_REQUIRED)
message (FATAL_ERROR "Could not find ITTNOTIFY!")
endif (ITTNOTIFY_FIND_REQUIRED)
endif (ITTNOTIFY_FOUND)

if(UNIX)
list(APPEND ITTNOTIFY_LIBRARIES dl)
endif()

endif (NOT ITTNOTIFY_FOUND)
2 changes: 2 additions & 0 deletions cmake/config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

#cmakedefine HAVE_STATS

#cmakedefine HAVE_ITT_INSTRUMENTATION

#cmakedefine TARGET_SLIMCACHE

#cmakedefine TARGET_TWEMCACHE
Expand Down
12 changes: 12 additions & 0 deletions deps/ccommon/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ option(HAVE_STATS "stats enabled by default" ON)
option(HAVE_DEBUG_MM "debugging oriented memory management disabled by default" OFF)
option(COVERAGE "code coverage" OFF)
option(HAVE_RUST "rust bindings not built by default" OFF)
option(HAVE_ITT_INSTRUMENTATION "instrument code with ITT API" OFF)

if(HAVE_RUST)
option(RUST_VERBOSE_BUILD "pass -vv to cargo compilation" OFF)
Expand Down Expand Up @@ -164,6 +165,17 @@ if(NOT CHECK_FOUND)
find_package(Check QUIET 0.10)
endif()

if (HAVE_ITT_INSTRUMENTATION)
if(PKG_CONFIG_FOUND)
pkg_check_modules(ITTNOTIFY REQUIRED ittnotify>=1.0)
else()
find_package(ITTNOTIFY REQUIRED 1.0)
endif()
include_directories(${ITTNOTIFY_INCLUDE_DIRS})
link_directories(${ITTNOTIFY_LIBRARY_DIRS})
link_libraries(${ITTNOTIFY_LIBRARIES})
endif(HAVE_ITT_INSTRUMENTATION)

find_package(Threads)


Expand Down
65 changes: 65 additions & 0 deletions deps/ccommon/cmake/FindITTNOTIFY.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# ITTNOTIFY is the instrumentation and tracing technology (ITT) APIs provided by
# the Intel® VTune™Amplifier enable your application to generate and control
# the collection of trace data during its execution.
#
# The following variables are set when ITTNOTIFY is found:
# ITTNOTIFY_FOUND = Set to true, if all components of ITTNOTIFY have been found.
# ITTNOTIFY_INCLUDE_DIRS = Include path for the header files of ITTNOTIFY.
# ITTNOTIFY_LIBRARY_DIRS = Library search path for the ITTNOTIFY libraries.
# ITTNOTIFY_LIBRARIES = Link these to use ITTNOTIFY.
# ITTNOTIFY_LFLAGS = Linker flags (optional).

if (NOT ITTNOTIFY_FOUND)

find_program(VTUNE_EXECUTABLE amplxe-cl)

if(NOT VTUNE_EXECUTABLE)
set(ITTNOTIFY_FOUND false)
return()
endif()

get_filename_component(VTUNE_DIR ${VTUNE_EXECUTABLE} PATH)
set(ITTNOTIFY_ROOT_DIR "${VTUNE_DIR}/..")

##_____________________________________________________________________________
## Check for the header files

find_path (ITTNOTIFY_INCLUDE_DIRS
NAMES ittnotify.h
HINTS ${ITTNOTIFY_ROOT_DIR}
PATHS /usr /usr/local
PATH_SUFFIXES include
)

##_____________________________________________________________________________
## Check for the library

find_library (ITTNOTIFY_LIBRARIES ittnotify
HINTS ${ITTNOTIFY_ROOT_DIR}
PATHS /usr /usr/local /opt/local
PATH_SUFFIXES lib64 lib
)

##_____________________________________________________________________________
## Actions taken when all components have been found

find_package_handle_standard_args (ITTNOTIFY DEFAULT_MSG ITTNOTIFY_LIBRARIES ITTNOTIFY_INCLUDE_DIRS)

if (ITTNOTIFY_FOUND)
if (NOT ITTNOTIFY_FIND_QUIETLY)
message (STATUS "Found components for ITTNOTIFY")
message (STATUS "ITTNOTIFY_ROOT_DIR = ${ITTNOTIFY_ROOT_DIR}")
message (STATUS "ITTNOTIFY_INCLUDE_DIRS = ${ITTNOTIFY_INCLUDE_DIRS}")
message (STATUS "ITTNOTIFY_LIBRARIES = ${ITTNOTIFY_LIBRARIES}")
endif (NOT ITTNOTIFY_FIND_QUIETLY)
else (ITTNOTIFY_FOUND)
if (ITTNOTIFY_FIND_REQUIRED)
message (FATAL_ERROR "Could not find ITTNOTIFY!")
endif (ITTNOTIFY_FIND_REQUIRED)
endif (ITTNOTIFY_FOUND)

if(UNIX)
list(APPEND ITTNOTIFY_LIBRARIES dl)
endif()

endif (NOT ITTNOTIFY_FOUND)
2 changes: 2 additions & 0 deletions deps/ccommon/config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,5 @@
#cmakedefine HAVE_STATS

#cmakedefine HAVE_DEBUG_MM

#cmakedefine HAVE_ITT_INSTRUMENTATION
4 changes: 4 additions & 0 deletions deps/ccommon/include/cc_define.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ extern "C" {
#define CC_DEBUG_MM 1
#endif

#ifdef HAVE_ITT_INSTRUMENTATION
#define CC_ITT 1
#endif

#define CC_OK 0
#define CC_ERROR -1

Expand Down
69 changes: 69 additions & 0 deletions deps/ccommon/include/cc_itt.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#pragma once

#include <cc_define.h>

#ifdef CC_ITT
#include "ittnotify.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif
#ifdef CC_ITT

#define ITT_DOMAIN_NAME "cc_itt"

#define cc_declare_itt_function(_keyword, _name) \
_keyword __itt_heap_function _name

#define cc_create_itt_malloc(_name) \
_name = __itt_heap_function_create(#_name, ITT_DOMAIN_NAME)

#define cc_create_itt_free(_name) \
_name = __itt_heap_function_create(#_name, ITT_DOMAIN_NAME)

#define cc_create_itt_realloc(_name) \
_name = __itt_heap_function_create(#_name, ITT_DOMAIN_NAME)

#define cc_itt_alloc(_itt_heap_f, _p, _s) do { \
__itt_heap_allocate_begin(_itt_heap_f, (size_t)(_s), 0); \
__itt_heap_allocate_end(_itt_heap_f, (void *)&(_p), (size_t)(_s), 0); \
} while (0)

#define cc_itt_zalloc(_itt_heap_f, _p, _s) do { \
__itt_heap_allocate_begin(_itt_heap_f, (size_t)(_s), 1); \
__itt_heap_allocate_end(_itt_heap_f, (void *)&(_p), (size_t)(_s), 1); \
} while (0)

#define cc_itt_free(_itt_heap_f, _p) do { \
__itt_heap_free_begin(_itt_heap_f, _p); \
__itt_heap_free_end(_itt_heap_f, _p); \
} while (0)

#define cc_itt_realloc(_itt_heap_f, _p, _np, _s) do { \
__itt_heap_reallocate_begin(_itt_heap_f, _p, (size_t)(_s), 0); \
__itt_heap_reallocate_end(_itt_heap_f, _p, (void *)&(_np), (size_t)(_s), 0); \
} while (0)

#define cc_itt_heap_internal_access() \
__itt_heap_internal_access_begin()

#define cc_itt_heap_internal_access_end() \
__itt_heap_internal_access_end()

#else
#define cc_declare_itt_function(_keyword, _name)
#define cc_create_itt_malloc(_name)
#define cc_create_itt_free(_name)
#define cc_create_itt_realloc(_name)
#define cc_itt_alloc(_itt_heap_f, _p, _s)
#define cc_itt_zalloc(_itt_heap_f, _p, _s)
#define cc_itt_free(_itt_heap_f, _p)
#define cc_itt_realloc(_itt_heap_f, _p, _np, _s)
#define cc_itt_heap_internal_access_begin()
#define cc_itt_heap_internal_access_end()
#endif /* CC_ITT */

#ifdef __cplusplus
}
#endif
9 changes: 9 additions & 0 deletions src/storage/cuckoo/cuckoo.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <cc_define.h>
#include <hash/cc_murmur3.h>
#include <cc_mm.h>
#include <cc_itt.h>

#include <datapool/datapool.h>

Expand Down Expand Up @@ -62,6 +63,9 @@ static size_t hash_size; /* item_size * max_nitem, computed at setup */
DECR_N(cuckoo_metrics, item_data_curr, item_datalen(it)); \
} while(0)

cc_declare_itt_function(static, cuckoo_malloc);
cc_declare_itt_function(static, cuckoo_free);

static inline uint32_t vlen(struct val *val)
{
if (val->type == VAL_TYPE_INT) {
Expand Down Expand Up @@ -291,6 +295,9 @@ cuckoo_setup(cuckoo_options_st *options, cuckoo_metrics_st *metrics)
}
ds = datapool_addr(pool);

cc_create_itt_malloc(cuckoo_malloc);
cc_create_itt_free(cuckoo_free);

cuckoo_init = true;
}

Expand Down Expand Up @@ -395,6 +402,7 @@ cuckoo_insert(struct bstring *key, struct val *val, proc_time_i expire)
item_set(it, key, val, expire);
INCR(cuckoo_metrics, item_insert);
ITEM_METRICS_INCR(it);
cc_itt_alloc(cuckoo_malloc, it, item_size);

return it;
}
Expand Down Expand Up @@ -438,6 +446,7 @@ cuckoo_delete(struct bstring *key)
ITEM_METRICS_DECR(it);
item_delete(it);
log_verb("deleting item at location %p", it);
cc_itt_free(cuckoo_free, it);

return true;
} else {
Expand Down
3 changes: 3 additions & 0 deletions src/storage/slab/item.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ _item_dealloc(struct item **it_p)
PERSLAB_DECR(id, item_curr);

slab_put_item(*it_p, id);
cc_itt_free(slab_free, *it_p);
*it_p = NULL;
}

Expand Down Expand Up @@ -147,6 +148,8 @@ item_insert(struct item *it, const struct bstring *key)
_item_link(it, false);
log_verb("insert it %p of id %"PRIu8" for key %.*s", it, it->id, key->len,
key->data);

cc_itt_alloc(slab_malloc, it, item_size(it));
}

/*
Expand Down
6 changes: 6 additions & 0 deletions src/storage/slab/slab.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ delta_time_i max_ttl = ITEM_MAX_TTL;
static bool slab_init = false;
slab_metrics_st *slab_metrics = NULL;

cc_declare_itt_function(,slab_malloc);
cc_declare_itt_function(,slab_free);

void
slab_print(void)
{
Expand Down Expand Up @@ -595,6 +598,9 @@ slab_setup(slab_options_st *options, slab_metrics_st *metrics)
goto error;
}

cc_create_itt_malloc(slab_malloc);
cc_create_itt_free(slab_free);

slab_init = true;

return;
Expand Down
3 changes: 3 additions & 0 deletions src/storage/slab/slab.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "slabclass.h"

#include <cc_define.h>
#include <cc_itt.h>
#include <cc_metric.h>
#include <cc_option.h>
#include <cc_util.h>
Expand Down Expand Up @@ -146,6 +147,8 @@ TAILQ_HEAD(slab_tqh, slab);
extern struct hash_table *hash_table;
extern size_t slab_size;
extern slab_metrics_st *slab_metrics;
cc_declare_itt_function(extern, slab_malloc);
cc_declare_itt_function(extern, slab_free);

/*
* Return the usable space for item sized chunks that would be carved out
Expand Down

0 comments on commit d5849d3

Please sign in to comment.