jmeter-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Philippe Mouawad <philippe.moua...@gmail.com>
Subject Re: svn commit: r1231777 - in /jmeter/trunk: src/core/org/apache/jmeter/resources/ src/protocol/http/org/apache/jmeter/protocol/http/control/ src/protocol/http/org/apache/jmeter/protocol/http/control/gui/ xdocs/
Date Mon, 16 Jan 2012 21:50:22 GMT
Hello Sebb,
My answers below.
Regards
Philippe

On Mon, Jan 16, 2012 at 12:06 AM, sebb <sebbaz@gmail.com> wrote:

> On 15 January 2012 22:27,  <pmouawad@apache.org> wrote:
> > Author: pmouawad
> > Date: Sun Jan 15 22:27:37 2012
> > New Revision: 1231777
> >
> > URL: http://svn.apache.org/viewvc?rev=1231777&view=rev
> > Log:
> > Bug 52471 - Improve Mirror Server performance by Using Pool of threads
> instead of launching a Thread for each request
>
> Does this still work when launching the mirror server from the batch file?
>
> I think so, what makes you think it is not ?
I ran Test cases and it works, what must I check ?


> What happens if the max_pool_size is exceeded?
>
> Tasks will enqueue up to 25 , then DiscardOldestPolicy will apply (a
little like Apache Server works)
And size of pool can be configured if you want to adapt it to number of
Threads.


> Modified:
> >    jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
> >
>  jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
> >
>  jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java
> >
>  jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java
> >
>  jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java
> >
>  jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java
> >    jmeter/trunk/xdocs/changes.xml
> >
> > Modified:
> jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1231777&r1=1231776&r2=1231777&view=diff
> >
> ==============================================================================
> > ---
> jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
> (original)
> > +++
> jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties Sun
> Jan 15 22:27:37 2012
> > @@ -333,6 +333,8 @@ http_response_code=HTTP response code
> >  http_url_rewriting_modifier_title=HTTP URL Re-writing Modifier
> >  http_user_parameter_modifier=HTTP User Parameter Modifier
> >  httpmirror_title=HTTP Mirror Server
> > +httpmirror_settings=Settings
> > +httpmirror_max_pool_size=Max number of Threads:
> >  id_prefix=ID Prefix
> >  id_suffix=ID Suffix
> >  if_controller_evaluate_all=Evaluate for all children?
> > @@ -640,6 +642,7 @@ proxy_content_type_filter=Content-type f
> >  proxy_content_type_include=Include\:
> >  proxy_daemon_bind_error=Could not create proxy - port in use. Choose
> another port.
> >  proxy_daemon_error=Could not create proxy - see log for details
> > +proxy_general_settings=Global Settings
> >  proxy_headers=Capture HTTP Headers
> >  proxy_httpsspoofing=Attempt HTTPS Spoofing
> >  proxy_httpsspoofing_match=Only spoof URLs matching:
> >
> > Modified:
> jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=1231777&r1=1231776&r2=1231777&view=diff
> >
> ==============================================================================
> > ---
> jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
> (original)
> > +++
> jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
> Sun Jan 15 22:27:37 2012
> > @@ -327,6 +327,8 @@ http_response_code=Code de r\u00E9ponse
> >  http_url_rewriting_modifier_title=Transcripteur d'URL HTTP
> >  http_user_parameter_modifier=Modificateur de param\u00E8tre utilisateur
> HTTP
> >  httpmirror_title=Serveur HTTP miroir
> > +httpmirror_settings=Param\u00E8tres
> > +httpmirror_max_pool_size=Nombre maximum de Threads:
> >  id_prefix=Pr\u00E9fixe d'ID
> >  id_suffix=Suffixe d'ID
> >  if_controller_evaluate_all=Evaluer pour tous les fils ?
> > @@ -637,6 +639,7 @@ proxy_daemon_error=Impossible de lancer
> >  proxy_headers=Capturer les ent\u00EAtes HTTP
> >  proxy_httpsspoofing=Tenter d'usurper le HTTPS
> >  proxy_httpsspoofing_match=Filtre d'URL pour usurpation HTTPS (regexp) \:
> > +proxy_general_settings=Param\u00E8tres g\u00E9n\u00E9raux
> >  proxy_regex=Correspondance des variables par regex ?
> >  proxy_sampler_settings=Param\u00E8tres Echantillon HTTP
> >  proxy_sampler_type=Type \:
> >
> > Modified:
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java?rev=1231777&r1=1231776&r2=1231777&view=diff
> >
> ==============================================================================
> > ---
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java
> (original)
> > +++
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java
> Sun Jan 15 22:27:37 2012
> > @@ -42,6 +42,10 @@ public class HttpMirrorControl extends A
> >
> >     public static final String PORT = "HttpMirrorControlGui.port"; //
> $NON-NLS-1$
> >
> > +    public static final String MAX_POOL_SIZE =
> "HttpMirrorControlGui.maxPoolSize"; // $NON-NLS-1$
> > +
> > +    public static final int DEFAULT_MAX_POOL_SIZE = 10;
> > +
> >     public HttpMirrorControl() {
> >         initPort(DEFAULT_PORT);
> >     }
> > @@ -69,13 +73,31 @@ public class HttpMirrorControl extends A
> >     public String getPortString() {
> >         return getPropertyAsString(PORT);
> >     }
> > +
> > +    /**
> > +     * @return Max Pool Size
> > +     */
> > +    public String getMaxPoolSizeAsString() {
> > +        return getPropertyAsString(MAX_POOL_SIZE);
> > +    }
> > +
> > +    private int getMaxPoolSize() {
> > +        return getPropertyAsInt(MAX_POOL_SIZE, DEFAULT_MAX_POOL_SIZE);
> > +    }
> > +
> > +    /**
> > +     * @param maxPoolSize Max Thread Pool size
> > +     */
> > +    public void setMaxPoolSize(String maxPoolSize) {
> > +        setProperty(MAX_POOL_SIZE, maxPoolSize);
> > +    }
> >
> >     public int getDefaultPort() {
> >         return DEFAULT_PORT;
> >     }
> >
> >     public void startHttpMirror() {
> > -        server = new HttpMirrorServer(getPort());
> > +        server = new HttpMirrorServer(getPort(), getMaxPoolSize());
> >         server.start();
> >         GuiPackage instance = GuiPackage.getInstance();
> >         if (instance != null) {
> >
> > Modified:
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java?rev=1231777&r1=1231776&r2=1231777&view=diff
> >
> ==============================================================================
> > ---
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java
> (original)
> > +++
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java
> Sun Jan 15 22:27:37 2012
> > @@ -21,6 +21,9 @@ package org.apache.jmeter.protocol.http.
> >  import java.io.InterruptedIOException;
> >  import java.net.ServerSocket;
> >  import java.net.Socket;
> > +import java.util.concurrent.ArrayBlockingQueue;
> > +import java.util.concurrent.ThreadPoolExecutor;
> > +import java.util.concurrent.TimeUnit;
> >
> >  import org.apache.jmeter.gui.Stoppable;
> >  import org.apache.jorphan.logging.LoggingManager;
> > @@ -44,6 +47,8 @@ public class HttpMirrorServer extends Th
> >      */
> >     private static final int ACCEPT_TIMEOUT = 1000;
> >
> > +    private static final long KEEP_ALIVE_TIME = 10;
> > +
> >     /** The port to listen on. */
> >     private final int daemonPort;
> >
> > @@ -54,14 +59,30 @@ public class HttpMirrorServer extends Th
> >     private volatile Exception except;
> >
> >     /**
> > +     * Max Executor Pool size
> > +     */
> > +    private int maxThreadPoolSize;
> > +
> > +    /**
> >      * Create a new Daemon with the specified port and target.
> >      *
> >      * @param port
> >      *            the port to listen on.
> >      */
> >     public HttpMirrorServer(int port) {
> > +       this(port, HttpMirrorControl.DEFAULT_MAX_POOL_SIZE);
> > +    }
> > +
> > +    /**
> > +     * Create a new Daemon with the specified port and target.
> > +     *
> > +     * @param port
> > +     *            the port to listen on.
> > +     */
> > +    public HttpMirrorServer(int port, int maxThreadPoolSize) {
> >         super("HttpMirrorServer");
> >         this.daemonPort = port;
> > +        this.maxThreadPoolSize = maxThreadPoolSize;
> >     }
> >
> >     /**
> > @@ -73,22 +94,28 @@ public class HttpMirrorServer extends Th
> >         except = null;
> >         running = true;
> >         ServerSocket mainSocket = null;
> > +        final ArrayBlockingQueue<Runnable> queue = new
> ArrayBlockingQueue<Runnable>(
> > +                25);
> > +        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
> > +                maxThreadPoolSize/2,
> > +                maxThreadPoolSize, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
> queue);
> > +        threadPoolExecutor.setRejectedExecutionHandler(new
> ThreadPoolExecutor.DiscardOldestPolicy());
> >
> >         try {
> >             log.info("Creating HttpMirror ... on port " + daemonPort);
> >             mainSocket = new ServerSocket(daemonPort);
> >             mainSocket.setSoTimeout(ACCEPT_TIMEOUT);
> >             log.info("HttpMirror up and running!");
> > -
> >             while (running) {
> >                 try {
> >                     // Listen on main socket
> >                     Socket clientSocket = mainSocket.accept();
> >                     if (running) {
> >                         // Pass request to new thread
> > -                        HttpMirrorThread thd = new
> HttpMirrorThread(clientSocket);
> > +                       threadPoolExecutor.execute(new
> HttpMirrorThread(clientSocket));
> > +                       //HttpMirrorThread thd = new
> HttpMirrorThread(clientSocket);
> >                         log.debug("Starting new Mirror thread");
> > -                        thd.start();
> > +                        //thd.start();
> >                     } else {
> >                         log.warn("Server not running");
> >                         JOrphanUtils.closeQuietly(clientSocket);
> > @@ -103,6 +130,7 @@ public class HttpMirrorServer extends Th
> >             except = e;
> >             log.warn("HttpMirror Server stopped", e);
> >         } finally {
> > +               threadPoolExecutor.shutdownNow();
> >             JOrphanUtils.closeQuietly(mainSocket);
> >         }
> >     }
> >
> > Modified:
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java?rev=1231777&r1=1231776&r2=1231777&view=diff
> >
> ==============================================================================
> > ---
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java
> (original)
> > +++
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java
> Sun Jan 15 22:27:37 2012
> > @@ -38,7 +38,7 @@ import org.apache.oro.text.regex.Perl5Ma
> >  * Thread to handle one client request. Gets the request from the client
> and
> >  * sends the response back to the client.
> >  */
> > -public class HttpMirrorThread extends Thread {
> > +public class HttpMirrorThread implements Runnable {
> >     private static final Logger log = LoggingManager.getLoggerForClass();
> >
> >     private static final String ISO_8859_1 = "ISO-8859-1"; //$NON-NLS-1$
> > @@ -54,7 +54,6 @@ public class HttpMirrorThread extends Th
> >     /**
> >      * Main processing method for the HttpMirror object
> >      */
> > -    @Override
> >     public void run() {
> >         log.debug("Starting thread");
> >         BufferedInputStream in = null;
> >
> > Modified:
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java?rev=1231777&r1=1231776&r2=1231777&view=diff
> >
> ==============================================================================
> > ---
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java
> (original)
> > +++
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java
> Sun Jan 15 22:27:37 2012
> > @@ -24,6 +24,7 @@ import java.awt.event.ActionListener;
> >  import java.util.Arrays;
> >  import java.util.Collection;
> >
> > +import javax.swing.BorderFactory;
> >  import javax.swing.Box;
> >  import javax.swing.JButton;
> >  import javax.swing.JLabel;
> > @@ -50,6 +51,8 @@ public class HttpMirrorControlGui extend
> >
> >     private JTextField portField;
> >
> > +    private JTextField maxPoolSizeField;
> > +
> >     private JButton stop, start;
> >
> >     private static final String ACTION_STOP = "stop"; // $NON-NLS-1$
> > @@ -58,6 +61,7 @@ public class HttpMirrorControlGui extend
> >
> >     private HttpMirrorControl mirrorController;
> >
> > +
> >     public HttpMirrorControlGui() {
> >         super();
> >         log.debug("Creating HttpMirrorControlGui");
> > @@ -83,6 +87,7 @@ public class HttpMirrorControlGui extend
> >         if (el instanceof HttpMirrorControl) {
> >             mirrorController = (HttpMirrorControl) el;
> >             mirrorController.setPort(portField.getText());
> > +            mirrorController.setMaxPoolSize(maxPoolSizeField.getText());
> >         }
> >     }
> >
> > @@ -102,6 +107,7 @@ public class HttpMirrorControlGui extend
> >         super.configure(element);
> >         mirrorController = (HttpMirrorControl) element;
> >         portField.setText(mirrorController.getPortString());
> > +
>  maxPoolSizeField.setText(mirrorController.getMaxPoolSizeAsString());
> >         repaint();
> >     }
> >
> > @@ -163,10 +169,22 @@ public class HttpMirrorControlGui extend
> >         label.setLabelFor(portField);
> >
> >
> > +        maxPoolSizeField = new
> JTextField(Integer.toString(HttpMirrorControl.DEFAULT_MAX_POOL_SIZE), 10);
> > +        maxPoolSizeField.setName(HttpMirrorControl.PORT);
> > +
> > +        JLabel mpsLabel = new
> JLabel(JMeterUtils.getResString("httpmirror_max_pool_size")); // $NON-NLS-1$
> > +        mpsLabel.setLabelFor(maxPoolSizeField);
> > +
> >         HorizontalPanel panel = new HorizontalPanel();
> > +
>  panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
> > +                JMeterUtils.getResString("httpmirror_settings"))); //
> $NON-NLS-1$
> > +
> >         panel.add(label);
> >         panel.add(portField);
> >
> > +        panel.add(mpsLabel);
> > +        panel.add(maxPoolSizeField);
> > +
> >         panel.add(Box.createHorizontalStrut(10));
> >
> >         return panel;
> > @@ -176,5 +194,6 @@ public class HttpMirrorControlGui extend
> >     public void clearGui(){
> >         super.clearGui();
> >         portField.setText(HttpMirrorControl.DEFAULT_PORT_S);
> > +
>  maxPoolSizeField.setText(Integer.toString(HttpMirrorControl.DEFAULT_MAX_POOL_SIZE));
> >     }
> >  }
> > \ No newline at end of file
> >
> > Modified: jmeter/trunk/xdocs/changes.xml
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1231777&r1=1231776&r2=1231777&view=diff
> >
> ==============================================================================
> > --- jmeter/trunk/xdocs/changes.xml (original)
> > +++ jmeter/trunk/xdocs/changes.xml Sun Jan 15 22:27:37 2012
> > @@ -260,6 +260,7 @@ Loads any additional properties found in
> >  <li>Bug 52333 - Reduce overhead in calculating
> SampleResult#nanoTimeOffset</li>
> >  <li>Bug 52346 - Shutdown detects if there are any non-daemon threads
> left which prevent JVM exit.</li>
> >  <li>Bug 52281 - Support for file Drag and Drop</li>
> > +<li>Bug 52471 - Improve Mirror Server performance by Using Pool of
> threads instead of launching a Thread for each request</li>
> >  </ul>
> >
> >  <h2>Non-functional changes</h2>
> >
> >
>



-- 
Cordialement.
Philippe Mouawad.

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message