On Thu, Apr 4, 2013 at 3:00 AM, node newbie <karl.brid...@gmail.com> wrote:
> I'm having issue setting up a node app as a service under Fedora 17.
>
> If I start the app/service manually by using:
>
> node server.js
>
> All works fine, the server starts and uses almost no CPU.
>
> But this needs to be an always running service that needs to be restarted if
> it crashes and needs to be started at boot time. To do this I've created a
> start script in init.d like so:
>
> #!/bin/bash
> #
> # chkconfig: - 99 01
> # description: node server
> . /etc/rc.d/init.d/functions
>
> USER="nodeuser"
> DAEMON="/usr/local/bin/supervisor"
> ROOT_DIR="/home/nodeuser/nodeserver"
>
> SERVER="$ROOT_DIR/server.js"
> LOG_FILE="$ROOT_DIR/app.js.log"
>
> LOCK_FILE="/var/lock/subsys/node-server"
>
> do_start()
> {
>         if [ ! -f "$LOCK_FILE" ] ; then
>                 echo -n $"Starting $SERVER: "
>                 runuser -l "$USER" -c "$DAEMON $SERVER >> $LOG_FILE &" &&
> echo_success || echo_failure
>                 RETVAL=$?
>                 echo
>                 [ $RETVAL -eq 0 ] && touch $LOCK_FILE
>         else
>                 echo "$SERVER is locked."
>                 RETVAL=1
>         fi
> }
> do_stop()
> {
>         echo -n $"Stopping $SERVER: "
>         pid=`ps -aefw | grep "$DAEMON $SERVER" | grep -v " grep " | awk
> '{print $2}'`
>         kill -9 $pid > /dev/null 2>&1 && echo_success || echo_failure
>         RETVAL=$?
>         echo
>         [ $RETVAL -eq 0 ] && rm -f $LOCK_FILE
> }
>
> case "$1" in
>         start)
>                 do_start
>                 ;;
>         stop)
>                 do_stop
>                 ;;
>         restart)
>                 do_stop
>                 do_start
>                 ;;
>         *)
>                 echo "Usage: $0 {start|stop|restart}"
>                 RETVAL=1
> esac
> exit $RETVAL
>
>
>
> If I start the server using this method the node process uses significant
> CPU (on my VPS it sits at 15-20% CPU while idle).
>
> Doing an strace on the process gives output like (and never stops):
>
> epoll_wait(5, {?} 0xbfe55240, 1024, 85) = 1
> clock_gettime(CLOCK_MONOTONIC, {2817, 89100171}) = 0
> read(8, "\1\0\0\0\0\0\0\0", 1024)       = 8
> clock_gettime(CLOCK_MONOTONIC, {2817, 89464229}) = 0
> epoll_wait(5, {}, 1024, 16)             = 0
> clock_gettime(CLOCK_MONOTONIC, {2817, 105857441}) = 0
> clock_gettime(CLOCK_MONOTONIC, {2817, 105979957}) = 0
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0x88656e4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x88656e0, {FUTEX_OP_SET, 0,
> FUTEX_OP_CMP_GT, 1}) = 1
> futex(0x88656c4, FUTEX_WAKE_PRIVATE, 1) = 1
>
>
> I'm at a loss for how to fix this..
>
> I'd be grateful for any solution - even if it involves using a different
> method to start and monitor the process (if there is a better way)
>
> I'm using node version: v0.10.2
>
> Any help will be greatly appreciated.

Is that strace output from your node process or node-supervisor's?

If the epoll_wait() timeouts are always that short (85 ms and 16 ms in
the snippet you posted), that would suggest there is a timer somewhere
that is firing continuously.

If you're certain it's not node-supervisor, try profiling your node
process to find out where it's spending its time.  Start it with
`--prof --log` and run the generated v8.log through the tick
processor.  You build it like this:

  $ cd deps/v8/build
  $ ln -s ../../../tools/gyp
  $ cd ..
  $ make -j8 native
  $ tools/linux-tick-processor /path/to/v8.log

If your application uses the cluster module, you should run `--prof
--log --logfile=%p.log` instead and run each file through the tick
processor separately.  --logfile=%p.log only works with master,
though.

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to nodejs+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to