github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/bin/proxyfsd-getprofile (about)

     1  #!/usr/bin/bash
     2  #
     3  # Copyright (c) 2015-2021, NVIDIA CORPORATION.
     4  # SPDX-License-Identifier: Apache-2.0
     5  #
     6  # Collect periodic heap profiles from proxyfsd using the 
     7  # HTTP interface.  This requies that proxyfsd be compiled with the
     8  # patch included below.
     9  #
    10  CMDNAME=`basename $0`
    11  HEAP_PROFILE_URL="http://localhost:6060/debug/pprof/heap"
    12  HEAP_PROFILE_SEC=180
    13  
    14  
    15  # patch for proxyfsd/daemon.go
    16  #
    17  cat <<!EOT > /dev/null
    18  a/proxyfsd/daemon.go b/proxyfsd/daemon.go
    19  index 656412a..8c441b7 100644
    20  --- a/proxyfsd/daemon.go
    21  +++ b/proxyfsd/daemon.go
    22  @@ -2,6 +2,8 @@ package proxyfsd
    23  
    24  import (
    25  "fmt"
    26  +       "net/http"
    27  +       _ "net/http/pprof"
    28  "os"
    29  "os/signal"
    30  "sync"
    31  @@ -246,6 +248,11 @@ func Daemon(confFile string, confStrings []string, signalHandlerIsArmed *bool, e
    32  	wg.Done()
    33  }()
    34  
    35  +       go func() {
    36  +               logger.Infof("proxyfsd.Daemon() starting debug HTTP server: %s",
    37  +                       http.ListenAndServe("localhost:6060", nil))
    38  +       }()
    39  +
    40  // Arm signal handler used to indicate termination and wait on it
    41  //
    42  // Note: signalled chan must be buffered to avoid race with window between
    43  !EOT
    44  
    45  function usage {
    46  echo "${CMDNAME} <dirname>" 1>&2
    47  exit 2
    48  }
    49  
    50  function timestamp {
    51  /bin/date +%Y-%m-%d_%H%M.%S
    52  }
    53  
    54  dirname="$1"
    55  if [ ! -d "$dirname" ]; then
    56  echo "${CMDNAME}: target directory '${dirname}' does not exist" 1>&2
    57  usage
    58  fi
    59  
    60  wget --no-verbose -O /dev/null ${HEAP_PROFILE_URL} > /dev/null
    61  if [ $? != 0 ]; then
    62  echo "${CMDNAME}: proxyfsd http server at '${HEAP_PROFILE_URL}' did not respond. Is the patch applied?" 1>&2
    63  usage
    64  fi
    65  
    66  proxyfsd_loc="/opt/ss/bin/proxyfsd /usr/bin/proxyfsd"
    67  proxyfsd_bin=""
    68  for fl in $proxyfsd_loc; do
    69  if [ -f "$fl" -a -x "$fl" ]; then
    70  	proxyfsd_bin="$fl"
    71  	break
    72  fi
    73  done
    74  if [ -z "$proxyfsd_bin" ]; then
    75  echo "${CMDNAME}: can not find proxyfsd executable" 1>&2
    76  usage
    77  fi
    78  
    79  cp $proxyfsd_bin "$dirname/proxyfsd-`timestamp`"
    80  if [ $? != 0 ]; then
    81  echo "${CMDNAME}: copy of '$proxyfsd_bin' to $dirname failed"
    82  usage
    83  fi
    84  
    85  while true; do
    86  
    87  	outfl="${dirname}/heap-`timestamp`.prof"
    88  	wget --no-verbose -O $outfl $HEAP_PROFILE_URL
    89  	# echo "collected $outfl"
    90  
    91  	sleep $HEAP_PROFILE_SEC
    92  	if [ $? != 0 ]; then
    93  		echo "$CMDNAME: sleep exited with rc $?; exiting"
    94  		break
    95  	fi
    96  done