TCP Read is a problem in itself whether it's a blocking or non-blocking IO. Problem with blocking is well known, therefore for scaling default choice is non-blocking read.
In non-blocking, it's advisable to do read in a while loop till read/recv returns - less than what you asked for or
set errno EAGAIN (specially for edge triggered case).
Here one important decision point is how much to read per recv call (recv call's buffer size).
There is one more way of reading data from TCP socket which can be beneficial in both blocking and non-blocking IO, which is knowing the data pending in TCP recvbuffer before making a recv/read call -
ioctl(fd, FIONREAD, &buffer_size);
from ioctl man page:
FIONREAD int - Get the number of bytes that are immediately available for reading.
and then doing read.