Re: 回复: PHP Performance/Scalability

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Jose

1. We are using Apache FPM

2. TTFB for both the apps will need some work from my side

3. Sorry, I am a bit confused, what do you mean by *execution time*? 

4. Machine Configuration:

Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   46 bits physical, 48 bits virtual
CPU(s):                          4
On-line CPU(s) list:             0-3
Thread(s) per core:              2
Core(s) per socket:              2
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           79
Model name:                      Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz

(Please note, the cpu utilisation never goes beyond 10-15% even if the load is increased to 6000 users from 1500 users)

Thank You.

Deepak
"The greatness of a nation can be judged by the way its animals are treated - Mahatma Gandhi"


"Plant a Tree, Go Green"



On Fri, Oct 29, 2021 at 12:37 PM Jose Nobile <jose.nobile@xxxxxxxxx> wrote:
Hello Deepak,

26 msecs -> 38 reqs/sec/thread -> If a CPU with 16 threads, then 615 reqs/sec
You are reaching 150 reqs/sec, it can mean:
1. You have 4 threads CPU (2 Core * 2 Threads or 4 Core * 1 Thread)
2. If you have 16 threads, but the HTTP -> PHP Connection is taking about 80 msecs

Questions:

1. How many CPU Threads does the system have?
2. How are you connecting HTTP to PHP? Apache mod_php, Apache/NGINX FPM, Apache mod_lsapi or Litespeed webserver?

The jsp execution by cli was not successful, check this: https://stackoverflow.com/a/23550396 and https://docs.oracle.com/cd/E19146-01/821-0790/abxcc/index.html

If not possible execute java from cli, the closest thing is to measure the TTFB (Time to first byte):

A one time step:
echo "time_namelookup:  %{time_namelookup}\n
       time_connect:  %{time_connect}\n
    time_appconnect:  %{time_appconnect}\n
   time_pretransfer:  %{time_pretransfer}\n
      time_redirect:  %{time_redirect}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n" > curl-format.txt

you should see:
 cat curl-format.txt
 time_namelookup:  %{time_namelookup}\n
       time_connect:  %{time_connect}\n
    time_appconnect:  %{time_appconnect}\n
   time_pretransfer:  %{time_pretransfer}\n
      time_redirect:  %{time_redirect}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n

Then,

curl -4 -sH 'Accept-encoding: br,gzip' -w "@curl-format.txt" -o /dev/null -s https://localhost/yourpathtojava

My output from a PHP application connected via Litespeed Enterprise:

time_namelookup:  0.060
       time_connect:  0.060
    time_appconnect:  0.125
   time_pretransfer:  0.125
      time_redirect:  0.000
 time_starttransfer:  0.125
                    ----------
         time_total:  0.126

It means the TTFB is 126-60 = 65 msecs is the time between the HTTP Request is sent and the response from the webapp starts answering (returns the first byte)

Then, we could assume 65 msecs is the execution time itself from the webapp (PHP or Java)

It would be the nearest measurement if the app cannot run from cli. BUT, If I run the same script which from the HTTP interface give me a 65 msecs TTFB:

time php index.php > /dev/null

real    0m0.029s
user    0m0.017s
sys     0m0.012s

It means the HTTP interface is taking about 36 msecs (HTTP decode + TLS decryption) "HTTP Time"

Test the TTFB for both apps, calculate the "HTTP time" for PHP, then the execution time for the Java App would be TTFB - "HTTP time" (Calculated from the PHP Execution).

3. What is the TTFB for both apps?
4. What is the execution time for both apps?


Regards,
José Nobile


On Fri, Oct 29, 2021 at 1:28 AM Deepak Goel <deicool@xxxxxxxxx> wrote:
Hello

For php (time php login.php):

real    0m0.026s
user    0m0.012s
sys     0m0.014s

For Java (time java login.jsp):

Error: Could not find or load main class login.jsp
Caused by: java.lang.ClassNotFoundException: login.jsp

Deepak
"The greatness of a nation can be judged by the way its animals are treated - Mahatma Gandhi"


"Plant a Tree, Go Green"



On Thu, Oct 28, 2021 at 11:46 PM Deepak Goel <deicool@xxxxxxxxx> wrote:
Hi

Let me check it out. Will get back.

Also, has anyone deployed PHP and it has scaled vertically to a higher number of users? Can you please post the results and the machine configuration details? It will help.

Thanks.

On Thu, 28 Oct 2021, 23:39 Jose Nobile, <jose.nobile@xxxxxxxxx> wrote:
Hi, 
I have read all the threads, I'm updated!

The waits that I've mentioned before are a signal that can prevent you from using the available CPU. For example, what  ifis the PHP has to read an external HTTP resource that needs to fetch? It will be in the wait time (network IO), rather than be speculative, test it.

You should execute the exact same code when executing from cli than the HTTP interface, just to isolate the issue and some tests.


Regards,
José Nobile


On Thu, Oct 28, 2021 at 12:43 PM Deepak Goel <deicool@xxxxxxxxx> wrote:
Hello Jose

1. Got it! I will try this tom afternoon (IST) and pass on the results.

2. However most of the php scripts are called from the web and not the command line. Also not all the methods are called. Typically, 1 out of 10 methods are called. (I am unsure how this would compare with the cli  time command). I guess we would have to divide by 10.

3. Also there is plenty of CPU available when I run a performance test on PHP. Only 10-15% is consumed. This would indicate that there is some synchronization happening in the PHP Infrastructure which is preventing the full usage of CPU (I don't see this in Java).
 
4. If I run a Java test, the result scales upto 6000+ users. For PHP, everything remains the same (code, cpu, db) but it scales only to 1500 users. There is no IO wait. And CPU/Memory are utilized only to 15%.

Thanks!

Deepak
"The greatness of a nation can be judged by the way its animals are treated - Mahatma Gandhi"


"Plant a Tree, Go Green"



On Thu, Oct 28, 2021 at 9:05 PM Jose Nobile <jose.nobile@xxxxxxxxx> wrote:
Hello Deepak, 

Test it using cli

> time php yourscript.php

What are the results for the time command?

For example:
time /opt/alt/php80/usr/bin/php test.php
1
real    0m0.010s
user    0m0.006s
sys     0m0.003s

It means each request is going to take 6 msecs from Linux user CPU  + 3 msecs from Linux system CPU + 1 msec from IO or other waits.

You should compare this to the Java applications testing in the same way, cli, no other process should be running (just the kernel and sys processes).

In this example, each request can be completed in 9 msecs from CPU + 1 msec from waits, at CPU level, it can handle 100 requests/sec per CPU thread, if it is a 16 threads CPU, it could handle 1600 reqs/sec

The HTTP interface can add some CPU, also the TLS (Elliptic curve are super fast, or the ciphers for TLS 1.3), it got under 1 msec when the HTTP interface is LSAPI from Litespeed Enterprise, which better than PHP-FPM, but first focus in the program itself, testing from cli, each individual requests optimizing at all levels, a kernel updated, NVMe for storage, DDR4 ECC 2933MHz, just loading the required PHP extensions, profiling SQL queries to be as efficient as possible anything from 1 msec or more can represent hundreds of potential more reqs/sec.

What are the results of the PHP and the Java program executed from cli in a dedicated system?


Regards,
José Nobile


On Thu, Oct 28, 2021 at 8:28 AM Deepak Goel <deicool@xxxxxxxxx> wrote:
Hello Shiplu

The resources mentioned  by you are not a bottleneck. There is plenty of it available.

Deepak
"The greatness of a nation can be judged by the way its animals are treated - Mahatma Gandhi"


"Plant a Tree, Go Green"



On Thu, Oct 28, 2021 at 2:15 PM shiplu <shiplu.net@xxxxxxxxx> wrote:
Hello Deepak,

If the code itself has a performance problem then it would show up even when the concurrency is 1. But it shows the issue when concurrency hits 1500. From 1 to 1500 there is the number when the response time starts to increase. That's where the problem arises. You mentioned it worked when increased the number of VMs. Check the system resource statistics when you are requesting to multiple VMs and a single VM.

It can happen that a metric is very high when you are using a single VM solution with 1500 concurrent requests. And the same metric would be very low in horizontal scaling setup. Some of these metrics can be
1. CPU 
2. Memory
3. IOWait time
4. Request Queue size
5. Open file descriptors
This is a metric you need to find out yourself. Once you find the metric you'll know horizontal scaling made it possible to lower it. Then for vertical scaling, you just need to increase that. 



Shiplu.Mokadd.im
Senior Unix Hacker

Innovation distinguishes between follower and leader 
—  Steve Jobs

An expert is a person who has made all the mistakes that can be made in a very narrow field.
—  Niels Bohr


On Thu, Oct 28, 2021 at 9:35 AM Deepak Goel <deicool@xxxxxxxxx> wrote:
We are using CodeIgniter 3.1.


Deepak
"The greatness of a nation can be judged by the way its animals are treated - Mahatma Gandhi"


"Plant a Tree, Go Green"



On Thu, Oct 28, 2021 at 1:03 PM Torsten Rosenberger <rosenberger@xxxxxxxxx> wrote:

>
> Some thoughts:
>
> 1. We are using a simple SQL Query in the code
>    $data = ""> >                         ->where(array('email' => $email_address))
>                         ->order_by('user_id', 'DESC')
>                         ->limit(1)
>                         ->get('users')
>                         ->row_array();
looks like you are using laraval

so i would start with $start =
microtime(true);

run you db code and the microtime(true) - $start;

and
compare this when you rewrite the code with native mysqli functions
like
mysqli_query

I know this is work but so you can get the feeling which
one is faster.
In small application you use frameworks but there could
be cases where a normal function ist much faster as writing a class
>
>
> 2. We are using mysqli
>
> 3. The SQL Query takes time in msec. And the Database is not a
> performance bottleneck
That could be OK for the database. But as in point 1. so the query
could be fast but the layer above could be slow.

I thing when you
compare the code sections with microtime you will find  the part eating
the time in the script.
>
> 4. We use mostly images with <img src=""> >
> 5. We have seen fpm outperform mod_php
>
> 6. The Java code accesses the same database (The database is on a
> seperate physical server). Also the queries are the same in Java as
> well PHP
>
> 7. I will try instrumenting the entire PHP code and see where the
> bottleneck is.
>
> Deepak
> "The greatness of a nation can be judged by the way its animals are
> treated - Mahatma Gandhi"
>
> +91 73500 12833
> deicool@xxxxxxxxx
>
> Facebook: https://www.facebook.com/deicool
> LinkedIn: www.linkedin.com/in/deicool
>
> "Plant a Tree, Go Green"
>
> Make In India : http://www.makeinindia.com/home
>
>
> On Thu, Oct 28, 2021 at 11:23 AM Torsten Rosenberger <
> rosenberger@xxxxxxxxx> wrote:
> > Hello Deepak
> >
> > I think PHP-FPM had heavily reduce the concurrency of PHP.
> > > PHP should immediately implement a API like WSGI/ASGI in python.
> > It
> > > is very simple but very useful.
> > >
> > > ------------------ 原始邮件 ------------------
> > > 发件人: "Deepak Goel" <deicool@xxxxxxxxx>;
> > > 发送时间: 2021年10月26日(星期二) 晚上11:15
> > > 收件人: "Alex"<al-php@xxxxxxx>;
> > > 抄送: "php-general General List"<php-general@xxxxxxxxxxxxx>;"Deepak
> > > Sharma"<deepak@xxxxxxxxxxx>;
> > > 主题: Re: PHP Performance/Scalability
> > >
> > > Hi
> > >
> > > The code is fairly simple. It contains a few images and a simple
> > SQL
> > > query (The same code in Java gives superb performance). We have
> > an
> > > Apache Web Server in front of php as of now. And I will try out
> > this
> > > (https://github.com/spiral/roadrunner).
> >
> > We are talking about a blackbox.
> > The code is simple ?
> >
> > How long take's
> > the sql query ?
> > What do you use to access the database PDO or mysqli ?
> > Y
> > ou wrote java is faster. Your java code access the same database ?
> >
> > You wrote a few images ?
> > Do you only show the images with <img src=""> > > or are you converting them for thumbnails etc.
> >
> > A long time ago there was a great presentation from Rasmus about
> > PHP
> > Performance.
> >
> > So a simple query on my Server's with mod_php and mysql
> > takes  0.0001 to 0.0008 seconds. If the simple query takes 0.01
> > Second
> > which looks fast but php have to wait for the DB. So there you can
> > loose factor 100 in the req/sec.
> >
> > Why are you using fpm and not the mod_php part in apache ?
> > OPcache is
> > active ?
> >
> > There are a lot of parameters we don't know.
> >
> > If you benchmark
> > your code with an easy microtime(true) call to see how long your
> > script
> > takes.
> > If you store the data in a file when you run your benchmark you
> > can maybe see if a code part is waiting for the database or
> > something
> > else.
> > So that the bottleneck ist not php.
> >
> > So i would go through the code
> > with microtime() an look what takes long and then go deepter.
> >
> > if the
> > code is heavy and the result dosen't change or a refresh after 5
> > min is
> > ok you can use the APCu cache or so on.
> >
> > If your code is super fast an still slow requests then you have to
> > strace the apache process to see if there is something miss
> > configured.
> >
> >
> > So as a PHP developer we cann't accept that Java is faster :)
> >
> > BR/Torsten
> >
> > > Thanks.
> > >
> > > Deepak
> > > "The greatness of a nation can be judged by the way its animals
> > are
> > > treated - Mahatma Gandhi"
> > >
> > > +91 73500 12833
> > > deicool@xxxxxxxxx
> > >
> > > Facebook: https://www.facebook.com/deicool
> > > LinkedIn: www.linkedin.com/in/deicool
> > >
> > > "Plant a Tree, Go Green"
> > >
> > > Make In India : http://www.makeinindia.com/home
> > >
> > >
> > > On Tue, Oct 26, 2021 at 5:15 PM Alex <al-php@xxxxxxx> wrote:
> > > > Hi.
> > > >
> > > > On 26.10.21 11:53, Deepak Goel wrote:
> > > > > Hello
> > > > >
> > > > > I have a very simple PHP application which I develop on
> > Apache-
> > > > Web-Server. However the application does
> > > > > not scale beyond 1500 concurrent users (150 requests/sec),
> > even
> > > > though there is plenty of hardware
> > > > > available (CPU is getting utilized 15%, Memory is getting
> > > > utilized 15%).
> > > > >
> > > > > On a similar note, when I develop the same application in
> > Java,
> > > > it scales to more than 6000 concurrent
> > > > > users (600 requests/sec) on the same hardware.
> > > > >
> > > > > Any pointers on how to address this scalability issue?
> > > >
> > > > The question is how "simple" is the PHP Code?
> > > > Maybe you can tune the Code or use another Server in front of
> > PHP
> > > > FPM like haproxy, Caddy, nginx?
> > > > Maybe you can try to run https://github.com/spiral/roadrunner
> > to
> > > > execute the PHP Code.
> > > >
> > > > Jm2c
> > > >
> > > > Regards
> > > > Alex
> > > >
> > > > > Thanks!
> > > > >
> > > > > Deepak
> > > > > "The greatness of a nation can be judged by the way its
> > animals
> > > > are treated - Mahatma Gandhi"
> > > > >
> > > > > +91 73500 12833
> > > > > deicool@xxxxxxxxx <mailto:deicool@xxxxxxxxx>
> > > > >
> > > > > Facebook: https://www.facebook.com/deicool <
> > > > https://www.facebook.com/deicool>
> > > > > LinkedIn: www.linkedin.com/in/deicool <
> > > > http://www.linkedin.com/in/deicool>
> > > > >
> > > > > "Plant a Tree, Go Green"
> > > > >
> > > > > Make In India : http://www.makeinindia.com/home <
> > > > http://www.makeinindia.com/home>
> > > >
> >


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux