On Mon, Jan 14, 2008 at 06:46:49AM -0800, Bryan Cantrill wrote:
> > So, I failed to understand the modules loading needs 4 minutes.
> 
> Yes, this is definitely fishy.  Is this a highly memory constrained system?
> If you "modunload -i 0" enough times to get dtrace(7D) unloaded (that
> is, "dtrace" doesn't appear in modinfo), does it again take 4 minutes?
> As you can imagine, it's a little tough to investigate this problem because
> we can't use DTrace to do it! ;)

Kicking the dtrace kernel module out is a bit trickier than back in the day
due to this bug:

  6282201 USDT probes can prevent dtrace(7D) from being unloaded

In order to unload dtrace, you'll need to make sure there are no processes
with USDT probes. This is done as part of one of the DTrace test suite
tests:

--8<-- usr/src/cmd/dtrace/test/tst/common/predicates/tst.predcache.ksh --8<--
28 unload()
29 {
30      #
31      # Get the list of services whose processes have USDT probes.  Ideally
32      # it would be possible to unload the fasttrap provider while USDT
33      # probes exist -- once that fix is integrated, this hack can go away
34      # We create two lists -- one of regular SMF services and one of legacy
35      # services -- since each must be enabled and disabled using a specific
36      # mechanism.
37      #
38      pids=$(dtrace -l | \
39          perl -ne 'print "$1\n" if (/^\s*\S+\s+\S*\D(\d+)\s+/);' | \
40          sort | uniq | tr '\n' ',')
41 
42      ctids=$(ps -p $pids -o ctid | tail +2 | sort | uniq)
43      svcs=
44      lrcs=
45 
46      for ct in $ctids
47      do
48              line=$(svcs -o fmri,ctid | grep " $ct\$")
49              svc=$(echo $line | cut -d' ' -f1)
50 
51              if [[ $(svcs -Ho STA $svc) == "LRC" ]]; then
52                      lrc=$(svcs -Ho SVC $svc | tr _ '?')
53                      lrcs="$lrcs $lrc"
54              else
55                      svcs="$svcs $svc"
56      fi
57      done
58 
59      for svc in $svcs
60      do
61              svcadm disable -ts $svc
62      done
63 
64      for lrc in $lrcs
65      do
66              #
67              # Does it seem a little paternalistic that lsvcrun requires
68              # this environment variable to be set? I'd say so...
69              #
70              SMF_RESTARTER=svc:/system/svc/restarter:default \
71                  /lib/svc/bin/lsvcrun $lrc stop
72      done
73 
74      modunload -i 0
75      modunload -i 0
76      modunload -i 0
77      modinfo | grep dtrace
78      success=$?
79 
80      for svc in $svcs
81      do
82              svcadm enable -ts $svc
83      done
84 
85      for lrc in $lrcs
86      do
87              SMF_RESTARTER=svc:/system/svc/restarter:default \
88                  /lib/svc/bin/lsvcrun $lrc start
89      done
90 
91      if [ ! $success ]; then
92              echo $tst: could not unload dtrace
93              exit 1
94      fi
95 }
--8<-- usr/src/cmd/dtrace/test/tst/common/predicates/tst.predcache.ksh --8<--

Adam

-- 
Adam Leventhal, FishWorks                        http://blogs.sun.com/ahl
_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to