dotMemory 2018.1 Help

Profile Web Application On a Server

Typically, determining performance issues in a web application is required when it is already running on a server. The table summarizes all possible options of profiling the application:

ProsNot cons but features
Local profiling
  • Easy to configure/use: you profile via the dotMemory GUI
  • dotMemory must be installed and run on the server, which may be impossible due to security restrictions, absence of GUI, etc
Remote profiling
  • Easy to configure/use: you profile via the dotMemory GUI
  • Snapshots are automatically uploaded to your local machine
  • dotMemory remote agent must be installed and run on the server
  • Communication via network is required
Profiling via console tools
  • No network communication required
  • Ability to create a number of predefined profiling configs and run them on demand
  • The console tools must be copied to and run on the server
  • Resulting snapshots must be manually copied from the server to the machine with dotTrace/dotMemory
Memory dumps
  • Nothing should be installed to the server
  • No profiling overhead
  • Memory dumps contain less data than dotMemory snapshots

Local profiling

how to app server local

Typically, local profiling is used when you need to profile the app that is hosted right on your (developer's) machine or on some testing environment, which doesn't impose any security/performance restrictions.

To locally profile a web app hosted on an IIS server

  1. Install dotMemory on the server.
  2. Run dotMemory as a standalone application. The dotMemory Home window will open.
  3. In the right panel, select Local.
  4. In the central panel, in Profile Application, select IIS.
  5. In the right panel, in Application Options, select Open URL and specify the URL of the profiled application. If you do not do this, dotMemory will start profiling of the first running application pool it'll be able to find.
  6. In the right panel, in Profiler Options, specify profiling type.
    For more details on profiler options, refer to the Profiler Options section.
  7. If you want dotMemory to start collecting the stack trace allocation data* right after the profiling session starts, select the Start collecting allocation data immediately option in the right panel.
  8. Optionally, if you are going to control profiling session (take snapshots, end session, and so on) using the API (rather than the Controller window), select Control profiling via API. For more details on how to control profiling using the API, refer to the Controlling Profiling Session Through API chapter.
  9. Click Run. Note that after you do this, the IIS service and, as a consequence, the profiled application pool will be restarted.
  10. Take snapshots. For more details on how to control profiling session, refer to Controlling Profiling Session (if you control profiling manually) or to Controlling Profiling Session Through API (if you control profiling using the API).
  11. After you collect the snapshot(s), click Detach on the Controller window to detach the profiler from the application pool.
  12. Analyze the collected snapshots.

Remote profiling

how to app server remote

Remote profiling is the best choice when it comes to a sudden performance drop / memory issue.

How it works: dotMemory is running on your local machine, the remote agent is running on the server, both communicating via TCP, as easy as that. The best thing about remote profiling is that you still work with the easy to use dotMemory GUI and the collected snapshots are automatically copied to and opened in dotMemory.

To remotely profile a web app hosted on an IIS server

  1. On the web server, do the following:
    • Copy the RemoteAgent.zip archive from the dotMemory installation directory on your local computer (by default, C:\Users\[username]\AppData\Local\JetBrains\Installations\dotMemory[N]) to any directory on the server.
    • Unpack the archive on the server.
    • Start RemoteAgent.exe from the console on the server.
    • Ensure that inbound connections to Remote Agent (by default, port 9100) are not blocked by the firewall.
  2. On the local computer, run dotMemory as a standalone application run dotMemory as a standalone application. The dotMemory window will open.
  3. In the right panel, select New Session | Remote.
  4. In the central panel, specify the address of the remote agent service in Remote Agent URL.
    By default, the URL is net.tcp://[remote_computer_IP_address]:9100/RemoteAgent.
  5. Click Connect to establish connection with the remote host.
  6. In the central panel, in Attach to Running Application select the w3wp.exe process that corresponds to the app pool running the profiled application.
  7. Optionally, if you are going to control profiling session (take snapshots, end session, and so on) using the API (rather than the Controller window), select Control profiling via API. For more details on how to control profiling using the API, refer to Controlling Profiling Session Through API.
  8. In the right panel, click Run.
  9. Take snapshots. For more details on how to control profiling session, refer to Controlling Profiling Session (if you control profiling manually) or to Controlling Profiling Session Through API (if you control profiling using the API).
  10. After you collect the snapshot(s), click Detach on the Controller window to detach the profiler from the application pool.
  11. Analyze the collected snapshots.

Profiling via console tools

how to app server console

Console tools are the best if you need to automate profiling: e.g., you should profile your web app from time to time. Another possible scenario is when you don’t have access to the server but some other person does, so you can simply provide him/her with profiling tools and a batch file.

How does it work? In short, you copy console tools to the server and either run the app under profiling (the app pool will be restarted) or attach the tool to the running application pool (w3wp.exe). Then you can get snapshots by simply sending special commands to stdin.

To profile a web app on an IIS server using console tools

  1. Download the zip archive with the ConsoleProfiler.exe tool and copy/unpack it to the server.
  2. Now, you have two options for getting a memory snapshot::
    • Attach dotMemory.exe to the running application pool and instantly get a snapshot:
      dotMemory.exe get-snapshot 1234 --save-to-dir=C:\Snapshots
      where 1234 is the process ID of the corresponding w3wp.exe process
    • Run the application pool under profiling (if the pool is already running, it will be restarted):
      dotMemory.exe start-iis --trigger-timer=30s --open-url=localhost/myapp --use-browser=Chrome
      where --open-url=localhost/myapp is the URL of your application. In case you've chosen to run the app pool, you cannot instantly get a snapshot. Instead, you should:
      • get a snapshot by condition: e.g. when --trigger-timer=30s is specified, snapshots are taken each 30 s
      • get a snapshot by sending a command to stdin: ##dotMemory["get-snapshot"]
      • get a snapshot on process exit (e.g. Recycle app pool in the IIS Manager)
    For more details on how to work with the dotMemory console profiler, please refer toUsing dotMemory Command-Line Profiler.
  3. Copy the resulting snapshot to the computer with installed dotMemory and analyze the snapshot.

Memory dumps

how to app server dumps

What if, for some reason, copying and running third-party tools on the server is not possible at all. Well, then your last resort is memory dumps. It can be taken with a number of tools, with the two most popular being Task Manager (comes with the operating system) and Process Explorer.

To profile a web app on an IIS server using memory dumps

  1. On the server, take a memory dump using the Task Manager or Process Explorer tool. When creating a dump of a 32-bit application with Task Manager, make sure you use a 32-bit version of the tool that can be found in C:\Windows\SysWOW64\taskmgr.exe.
    get memory dump
  2. Copy the resulting snapshot to the computer with installed dotMemory and open it using the Import Dump command.
  3. Analyze the snapshot.
Last modified: 11 May 2018