B4J Tutorial [Server] Performance measures

Discussion in 'B4J Tutorials' started by Erel, Feb 5, 2014.

  1. Erel

    Erel Administrator Staff Member Licensed User

    B4J server library is based on an open source project named Jetty.
    Jetty server performance is excellent which means that B4J server performance is also excellent.

    The following numbers are the result of a simple test where one program sends many requests to the server program. Both running on the same computer.

    The actual numbers are not very important and should not be taken too seriously. The main point is that a B4J server can easily handle huge traffic.

    The numbers were measured in Release mode.
    • Simple handler that writes some text as the response: >2000 requests per second.
    • Handler that connects to a local MySQL database (wamp installation) and issues a SELECT query (using ConnectionPool): >2000 requests per second
    • Same handler in single threaded mode: ~1300 requests per second
    • Handler that issues an INSERT command to the MySQL database: ~180 requests per second
    • Same handler in single threaded mode: ~35 requests per second
     
  2. warwound

    warwound Expert Licensed User

    Very impressive.
    Were the benchmarks done on a particularly hi-spec computer or just a 'standard' spec computer?

    Martin.
     
  3. Erel

    Erel Administrator Staff Member Licensed User

    Pretty standard desktop computer - Core i5, 8gb ram. The hard disk is quite fast (not SSD).
     
  4. luke2012

    luke2012 Well-Known Member Licensed User

    I agree with @warwound.
    Impressive performance on a pc with MySQL DB.
    What about the "Data Collection Solution" with a SQLite DB as reported in your Tutorial ?
     
    Last edited: Apr 18, 2014
  5. Erel

    Erel Administrator Staff Member Licensed User

    The test was done with a SQLite database with a single table. The table has two columns and 10000 rows:
    Code:
    sql1.InitializeSQLite(File.DirApp, "1.db"True)
    sql1.ExecNonQuery(
    "PRAGMA journal_mode = wal")
    DBUtils.CreateTable(sql1, 
    "table1", _
       CreateMap(
    "col1": DBUtils.DB_INTEGER, "col2": DBUtils.DB_TEXT), "col1")
    sql1.BeginTransaction
    For i = 1 To 10000
       sql1.ExecNonQuery2(
    "INSERT INTO table1 VALUES(?,?)", _
         
    Array As Object(i, "value " & i))
    Next
    sql1.TransactionSuccessful
    Make sure to read this tutorial: http://www.basic4ppc.com/android/forum/threads/webapp-concurrent-access-to-sqlite-databases.39904/

    - Getting a value from a random row (based on the primary key): >2000 requests per second.
    - Same as above. 10% of the requests are INSERT statements: ~700 requests per second.
    - 50% of the requests are INSERT statements: ~180 requests per second.
    - 100% of the requests are INSERT statements: ~95 requests per second.

    Notes:
    1. These tests were done on a SSD drive (the MySQL tests were done on a non-SSD drive).
    2. During the tests a bug was found in SQL library v1.10 related to concurrent updates of SQLite databases. v1.11 fixes this issue.
    3. The results are quite good and show that SQLite can be a good choice for a backend database.
     
    Last edited: Apr 21, 2014
  6. luke2012

    luke2012 Well-Known Member Licensed User

    Thank you @Erel ! It's a very good news for me.

    The above code run on a B4J desktop app, right ?
     
    Last edited: Apr 22, 2014
  7. Erel

    Erel Administrator Staff Member Licensed User

    A server app that runs on the desktop.
     
    luke2012 likes this.
  8. luke2012

    luke2012 Well-Known Member Licensed User

    Ok. Now I understood.
    Thanks.
     
  9. billzhan

    billzhan Active Member Licensed User

    FYI luke2012,

    I made a test with simulated incoming connection with ab.
    SW: WinXp sp3,B4j 2.0 and SQL library v1.10.
    HW: Intel T7300 4G SSD pxm5s 128g

    The test results are not accurate, with 10%-20% variation.

    ---------
    -n500 -c10 Results:
    100% read:1066.67 [#/sec] (mean)
    90% read: 864.86 [#/sec] (mean)
    50% read:680.85 [#/sec] (mean)
    10% read:695.65 [#/sec] (mean)
    0% read:727.27 [#/sec] (mean)

    ---------
    -n5000 -c10 Results:
    100% read:831.17 [#/sec] (mean)
    90% read:831.17 [#/sec] (mean)
    50% read:769.23 [#/sec] (mean)
    10% read:732.27 [#/sec] (mean)
    0% read: 728.93 [#/sec] (mean)

    ---------
    -n5000 -c100 Results:
    100% read:694.14 [#/sec] (mean)
    90% read:686.70 [#/sec] (mean)
    50% read:603.77 [#/sec] (mean)
    10% read:576.58 [#/sec] (mean)
    0% read:544.22 [#/sec] (mean)




    How the test is Done:
    1.Simulate incoming connection with ab(apache benchmark), with two parameters, id and p.

    1.1 id is the test ID which is used to pass the identify the test.It will be recorded in "errorlog.txt" if any exception.

    1.2 p is the percentage of read, an integer 0-100, when p=50 there is 50% that the thread will read a random value from db.

    1.3 Write a "test.bat" file under the same path of "ab.exe". -n500 means 500 connections will be sent totally, -c10 means 10 concurrent connections:
    Code:
    ab -n500 -c10 "http://192.168.1.100:51042/update?id=1&p=100"  >>testres.txt
    2.Run the B4J server at release mode.

    3.Run the test.bat, and wait for a moment till the command windows to close.

    4.Find in "testres.txt“ file under the same path of "ab.exe", the line "Requests per second: 914.29 [#/sec] (mean) " shows the result.

    5.If there is any exception, it will be recorded in "errorlog.txt" under DirApp folder.
     

    Attached Files:

    Last edited: Apr 22, 2014
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice