There's a lot you can still do to monitor your hardware and narrow down things.
You didn't say if you're running a windows machine or which version of OS but I am assuming it's a Windows 10 machine for now.
You can use a tool called performance monitor (perfmon). This will enable you to monitor key metrics for your system and based on the values determine where your bottleneck may be.
Have a look around you may also find some metrics for GPU and the like too.
To actually find your metrics is a bit of an art and to be honest I don't have them all to hand but try the following for now:
Memory | % Committed Bytes in Use: Tracks what percentage of your RAM
is currently committed (“in use”). This should fluctuate as apps are
opened and closed, but if it steadily increases, it could indicate a
Network Interface | Bytes Total/sec: Tracks how many bytes are sent
and received over a particular network interface (such as Wi-Fi or
Ethernet). If this ever gets above 70% of an interface’s bandwidth,
you should consider upgrading.
Paging File | % Usage: Tracks how much of your system’s paging file is
being used. If this is consistently high, you should consider
increasing your physical RAM or at least increase the size of your
Physical Disk | % Disk Time: Tracks how much of the hard drive’s time
is spent handling read and/or write requests. If this is consistently
high, you should consider upgrading to a solid state drive.
Physical Disk | % Disk Read Time: Same as above except only for read
Physical Disk | % Disk Write Time: Same as above except only for write
Processor | % Interrupt Time: Tracks how much time is spent by your
CPU handling hardware interrupts. If this is consistently above
10-20%, it could indicate a potential issue in one of your hardware
Thread | % Processor Time: Tracks how much of your processor’s
capabilities are being used by an individual process thread (an app
could have multiple threads). Only useful if you can identify which
thread to monitor.
Some SQL ones that I have used:
PhysicalDisk(_Total)\Avg. Disk sec/Read PhysicalDisk(_Total)\Avg. Disk
sec/Write These two counters tell you how quickly your I/O subsystem
is responding to requests for data from the operating system; in other
words, latency. The latency values returned are valid regardless of
the type of I/O subsystem you're using, whether it's local physical
magnetic disk, SAN drives, NAS drives, or solid state drives. Your
latency values should normally not be more than 20ms; if you're using
SSD, probably not more than 5ms. If you see latency values of a second
or more, your I/O subsystem has issues that need to be addressed to
keep performance at an acceptable level.
System\Processor Queue Length The Processor Queue Length counter tells
you the number of threads that are waiting for time on the system
processor. If this number is greater than 0, that means that there are
more requests per core than the system can handle, and this can be a
cause for significant performance issues. I once had a client that had
a month-end process that had to be run during the business day, which
would take 2.5 to 3 hours to run; when it ran, performance for
everyone else on that system would be horribly slow. I looked at the
Processor Queue Length counter – normally it would get to no higher
than 3 or 4 during the day, but During month-end it jumped to
somewhere between 30 and 50. The client was running on a virtual
machine with 4 processors, and I asked if they could double that. They
did, and the next month-end completed in 45 minutes.