Flask request.form.get too slow?












1















I am using Flask for my Web Api service.



Finding that my services sometimes (1/100 requests) respond really slow (seconds), I started debugging, which showed me that sometimes the service hangs on reading the request field.



@app.route('/scan', methods=['POST'])
def scan():
start_time = time.time()
request_description = request.form.get('requestDescription')
end_time = time.time()
app.logger.debug('delay is ' + end_time-start_time)


Here I found that delay between start_time and end_time can be up to 2 minutes.



I've read about using Flask's Werkzeug as a production server, so I tried GUnicorn as an alternative - same thing.



I feel that my problem is somehow similar to this one, with the difference that another server didn't solve the problem.



I tried to profile the app using cProfile and SnakeViz, but with the non-prod Werkzeug server - as I don't get how to profile python apps running on GUnicorn. (maybe anyone here knows how to?)



My POST requests contain description and a file. The file can vary in size, but the logs show that the issue reproduces regardless of the file size.



People also usually say that Flask should be used in Nginx-[normal server]-flask combo, but as I use the service inside Openshift, I doubt this has any meaning. (HaProxy works as a balancer)



So my settings:
Alpine 3.8.1
GUnicorn:
workers:3
threads:1



What happens under the hood when I call this?



request.form.get('requestDescription')


How can I profile Python code under GUnicorn?
Did anyone else encounter such a problem?



Any help will be appreciated










share|improve this question





























    1















    I am using Flask for my Web Api service.



    Finding that my services sometimes (1/100 requests) respond really slow (seconds), I started debugging, which showed me that sometimes the service hangs on reading the request field.



    @app.route('/scan', methods=['POST'])
    def scan():
    start_time = time.time()
    request_description = request.form.get('requestDescription')
    end_time = time.time()
    app.logger.debug('delay is ' + end_time-start_time)


    Here I found that delay between start_time and end_time can be up to 2 minutes.



    I've read about using Flask's Werkzeug as a production server, so I tried GUnicorn as an alternative - same thing.



    I feel that my problem is somehow similar to this one, with the difference that another server didn't solve the problem.



    I tried to profile the app using cProfile and SnakeViz, but with the non-prod Werkzeug server - as I don't get how to profile python apps running on GUnicorn. (maybe anyone here knows how to?)



    My POST requests contain description and a file. The file can vary in size, but the logs show that the issue reproduces regardless of the file size.



    People also usually say that Flask should be used in Nginx-[normal server]-flask combo, but as I use the service inside Openshift, I doubt this has any meaning. (HaProxy works as a balancer)



    So my settings:
    Alpine 3.8.1
    GUnicorn:
    workers:3
    threads:1



    What happens under the hood when I call this?



    request.form.get('requestDescription')


    How can I profile Python code under GUnicorn?
    Did anyone else encounter such a problem?



    Any help will be appreciated










    share|improve this question



























      1












      1








      1








      I am using Flask for my Web Api service.



      Finding that my services sometimes (1/100 requests) respond really slow (seconds), I started debugging, which showed me that sometimes the service hangs on reading the request field.



      @app.route('/scan', methods=['POST'])
      def scan():
      start_time = time.time()
      request_description = request.form.get('requestDescription')
      end_time = time.time()
      app.logger.debug('delay is ' + end_time-start_time)


      Here I found that delay between start_time and end_time can be up to 2 minutes.



      I've read about using Flask's Werkzeug as a production server, so I tried GUnicorn as an alternative - same thing.



      I feel that my problem is somehow similar to this one, with the difference that another server didn't solve the problem.



      I tried to profile the app using cProfile and SnakeViz, but with the non-prod Werkzeug server - as I don't get how to profile python apps running on GUnicorn. (maybe anyone here knows how to?)



      My POST requests contain description and a file. The file can vary in size, but the logs show that the issue reproduces regardless of the file size.



      People also usually say that Flask should be used in Nginx-[normal server]-flask combo, but as I use the service inside Openshift, I doubt this has any meaning. (HaProxy works as a balancer)



      So my settings:
      Alpine 3.8.1
      GUnicorn:
      workers:3
      threads:1



      What happens under the hood when I call this?



      request.form.get('requestDescription')


      How can I profile Python code under GUnicorn?
      Did anyone else encounter such a problem?



      Any help will be appreciated










      share|improve this question
















      I am using Flask for my Web Api service.



      Finding that my services sometimes (1/100 requests) respond really slow (seconds), I started debugging, which showed me that sometimes the service hangs on reading the request field.



      @app.route('/scan', methods=['POST'])
      def scan():
      start_time = time.time()
      request_description = request.form.get('requestDescription')
      end_time = time.time()
      app.logger.debug('delay is ' + end_time-start_time)


      Here I found that delay between start_time and end_time can be up to 2 minutes.



      I've read about using Flask's Werkzeug as a production server, so I tried GUnicorn as an alternative - same thing.



      I feel that my problem is somehow similar to this one, with the difference that another server didn't solve the problem.



      I tried to profile the app using cProfile and SnakeViz, but with the non-prod Werkzeug server - as I don't get how to profile python apps running on GUnicorn. (maybe anyone here knows how to?)



      My POST requests contain description and a file. The file can vary in size, but the logs show that the issue reproduces regardless of the file size.



      People also usually say that Flask should be used in Nginx-[normal server]-flask combo, but as I use the service inside Openshift, I doubt this has any meaning. (HaProxy works as a balancer)



      So my settings:
      Alpine 3.8.1
      GUnicorn:
      workers:3
      threads:1



      What happens under the hood when I call this?



      request.form.get('requestDescription')


      How can I profile Python code under GUnicorn?
      Did anyone else encounter such a problem?



      Any help will be appreciated







      python flask gunicorn cprofile snakeviz






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 23 '18 at 15:02







      Dmitry Zuev

















      asked Nov 23 '18 at 14:34









      Dmitry ZuevDmitry Zuev

      515




      515
























          0






          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53448608%2fflask-request-form-get-too-slow%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53448608%2fflask-request-form-get-too-slow%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Wiesbaden

          Marschland

          Dieringhausen